gas: error for section type, attr, or entsize change

Message ID 20200210050215.GP5669@bubble.grove.modra.org
State New
Headers show
Series
  • gas: error for section type, attr, or entsize change
Related show

Commit Message

Alan Modra Feb. 10, 2020, 5:02 a.m.
I think it is reasonable to expect that section directives be
consistent within a source file, so this patch changes some gas
warnings to errors.

	* config/obj-elf.c (obj_elf_change_section): Error for section
	type, attr or entsize changes in assembly.
	* testsuite/gas/elf/elf.exp: Pass -Z to gas for section5 test.
	* testsuite/gas/elf/section5.l: Update.


-- 
Alan Modra
Australia Development Lab, IBM

Patch

diff --git a/gas/config/obj-elf.c b/gas/config/obj-elf.c
index d7a07fec6b..a7225983f6 100644
--- a/gas/config/obj-elf.c
+++ b/gas/config/obj-elf.c
@@ -767,7 +767,17 @@  obj_elf_change_section (const char *name,
     {
       if (type != SHT_NULL
 	  && (unsigned) type != elf_section_type (old_sec))
-	as_warn (_("ignoring changed section type for %s"), name);
+	{
+	  if (ssect != NULL)
+	    /* This is a special section with known type.  User
+	       assembly might get the section type wrong; Even high
+	       profile projects like glibc have done so in the past.
+	       So don't error in this case.  */
+	    as_warn (_("ignoring changed section type for %s"), name);
+	  else
+	    /* Do error when assembly isn't self-consistent.  */
+	    as_bad (_("changed section type for %s"), name);
+	}
 
       if (attr != 0)
 	{
@@ -779,14 +789,19 @@  obj_elf_change_section (const char *name,
 		  | SEC_EXCLUDE | SEC_SORT_ENTRIES | SEC_MERGE | SEC_STRINGS
 		  | SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD
 		  | SEC_THREAD_LOCAL)))
-	    as_warn (_("ignoring changed section attributes for %s"), name);
+	    {
+	      if (ssect != NULL)
+		as_warn (_("ignoring changed section attributes for %s"), name);
+	      else
+		as_bad (_("changed section attributes for %s"), name);
+	    }
 	  else
 	    /* FIXME: Maybe we should consider removing a previously set
 	       processor or application specific attribute as suspicious ?  */
 	    elf_section_flags (sec) = attr;
 
 	  if ((flags & SEC_MERGE) && old_sec->entsize != (unsigned) entsize)
-	    as_warn (_("ignoring changed section entity size for %s"), name);
+	    as_bad (_("changed section entity size for %s"), name);
 	}
     }
 
diff --git a/gas/testsuite/gas/elf/elf.exp b/gas/testsuite/gas/elf/elf.exp
index 0f9b2672c4..b0522af3bb 100644
--- a/gas/testsuite/gas/elf/elf.exp
+++ b/gas/testsuite/gas/elf/elf.exp
@@ -202,7 +202,7 @@  if { [is_elf_format] } then {
 	# new sections created without atrributes.
 	# The RX port does not complain about changing the attributes of the
 	# .data and .bss sections since it does not use those names.
-	run_elf_list_test "section5" "" "-al" "-SW" "| grep \" \\\\.test\\\[0-9\\\]\""
+	run_elf_list_test "section5" "" "-al -Z" "-SW" "| grep \" \\\\.test\\\[0-9\\\]\""
     }
     run_dump_test "struct"
     if { ![istarget "alpha*-*-*"] } then {
diff --git a/gas/testsuite/gas/elf/section5.l b/gas/testsuite/gas/elf/section5.l
index 31b87e6035..00a1456068 100644
--- a/gas/testsuite/gas/elf/section5.l
+++ b/gas/testsuite/gas/elf/section5.l
@@ -1,12 +1,13 @@ 
 .*: Assembler messages:
-.*:7: Warning: .*
-.*:7: Warning: .*
-.*:10: Warning: .*
-.*:16: Warning: .*
+.*:7: Error: .*
+.*:7: Error: .*
+.*:10: Error: .*
+.*:16: Error: .*
 .*:18: Warning: .*
 .*:20: Warning: .*
 .*:22: Warning: .*
 .*:24: Warning: .*
+4 errors, 4 warnings, generating bad object file
 .*GAS.*