[PATCH] gas: Allow SHF_GNU_RETAIN on SHT_NOTE section
H.J. Lu
hjl.tools@gmail.com
Sat Feb 13 15:25:20 GMT 2021
Since SHF_GNU_RETAIN is allowed on SHT_NOTE section, strip SHF_GNU_RETAIN
when checking incorrect section attributes on SHT_NOTE section.
PR gas/27412
* config/obj-elf.c (obj_elf_change_section): Strip SHF_GNU_RETAIN.
* testsuite/gas/elf/elf.exp: Run section28.
* testsuite/gas/elf/section28.d: New file.
* testsuite/gas/elf/section28.s: Likewise.
---
gas/config/obj-elf.c | 8 +++++++-
gas/testsuite/gas/elf/elf.exp | 1 +
gas/testsuite/gas/elf/section28.d | 15 +++++++++++++++
gas/testsuite/gas/elf/section28.s | 11 +++++++++++
4 files changed, 34 insertions(+), 1 deletion(-)
create mode 100644 gas/testsuite/gas/elf/section28.d
create mode 100644 gas/testsuite/gas/elf/section28.s
diff --git a/gas/config/obj-elf.c b/gas/config/obj-elf.c
index f52dc69f0c3..13f54b10857 100644
--- a/gas/config/obj-elf.c
+++ b/gas/config/obj-elf.c
@@ -667,12 +667,18 @@ obj_elf_change_section (const char *name,
| SHF_MASKPROC))
& ~ssect->attr) != 0)
{
+ /* Strip SHF_GNU_RETAIN. */
+ bfd_vma generic_attr = attr;
+ if (elf_tdata (stdoutput)->has_gnu_osabi)
+ generic_attr &= ~SHF_GNU_RETAIN;
+
/* As a GNU extension, we permit a .note section to be
allocatable. If the linker sees an allocatable .note
section, it will create a PT_NOTE segment in the output
file. We also allow "x" for .note.GNU-stack. */
if (ssect->type == SHT_NOTE
- && (attr == SHF_ALLOC || attr == SHF_EXECINSTR))
+ && (generic_attr == SHF_ALLOC
+ || generic_attr == SHF_EXECINSTR))
;
/* Allow different SHF_MERGE and SHF_STRINGS if we have
something like .rodata.str. */
diff --git a/gas/testsuite/gas/elf/elf.exp b/gas/testsuite/gas/elf/elf.exp
index 2917ea9fe5b..1fd92f31ab6 100644
--- a/gas/testsuite/gas/elf/elf.exp
+++ b/gas/testsuite/gas/elf/elf.exp
@@ -273,6 +273,7 @@ if { [is_elf_format] } then {
run_dump_test "section25"
run_dump_test "section26"
run_dump_test "section27"
+ run_dump_test "section28"
run_dump_test "sh-link-zero"
run_dump_test "dwarf2-1" $dump_opts
run_dump_test "dwarf2-2" $dump_opts
diff --git a/gas/testsuite/gas/elf/section28.d b/gas/testsuite/gas/elf/section28.d
new file mode 100644
index 00000000000..a1fd65b0a65
--- /dev/null
+++ b/gas/testsuite/gas/elf/section28.d
@@ -0,0 +1,15 @@
+#readelf: -h -S --wide
+#name: SHF_GNU_RETAIN sections 28
+#notarget: ![supports_gnu_osabi]
+
+#...
+ +OS/ABI: +UNIX - (GNU|FreeBSD)
+#...
+ \[..\] \.note\.Linux +NOTE +[0-9a-f]+ [0-9a-f]+ [0-9a-f]+ 00 +A +0.*
+#...
+ \[..\] \.note\.Linux +NOTE +[0-9a-f]+ [0-9a-f]+ [0-9a-f]+ 00 +AR +0.*
+#...
+ \[..\] \.note\.foo +NOTE +[0-9a-f]+ [0-9a-f]+ [0-9a-f]+ 00 +0 +.*
+#...
+ \[..\] \.note\.foo +NOTE +[0-9a-f]+ [0-9a-f]+ [0-9a-f]+ 00 +R +0 +.*
+#pass
diff --git a/gas/testsuite/gas/elf/section28.s b/gas/testsuite/gas/elf/section28.s
new file mode 100644
index 00000000000..ebcf42c2e24
--- /dev/null
+++ b/gas/testsuite/gas/elf/section28.s
@@ -0,0 +1,11 @@
+ .section .note.Linux,"a"
+ .word 1
+
+ .section .note.Linux,"aR"
+ .word 1
+
+ .section .note.foo
+ .word 1
+
+ .section .note.foo,"R"
+ .word 1
--
2.29.2
More information about the Binutils
mailing list