From 33176d912add7680277ad5e18af0e6303d9a7af8 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Fri, 7 Feb 2020 00:42:45 +1030 Subject: [PATCH] gas: error for section type, attr, or entsize change * 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. --- gas/ChangeLog | 7 +++++++ gas/config/obj-elf.c | 21 ++++++++++++++++++--- gas/testsuite/gas/elf/elf.exp | 2 +- gas/testsuite/gas/elf/section5.l | 9 +++++---- 4 files changed, 31 insertions(+), 8 deletions(-) diff --git a/gas/ChangeLog b/gas/ChangeLog index 4c60d86a66e..a07d9b7f35e 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,10 @@ +2020-02-10 Alan Modra + + * 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. + 2020-02-10 Alan Modra * output-file.c (output_file_close): Do a normal close when diff --git a/gas/config/obj-elf.c b/gas/config/obj-elf.c index d7a07fec6bf..a7225983f6a 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 0f9b2672c4c..b0522af3bb1 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 31b87e60351..00a14560684 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.* -- 2.30.2