[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