gas: Allow SHF_GNU_RETAIN on SHT_NOTE section

Message ID 20210213152520.899804-1-hjl.tools@gmail.com
State New
Headers show
Series
  • gas: Allow SHF_GNU_RETAIN on SHT_NOTE section
Related show

Commit Message

Nick Clifton via Binutils Feb. 13, 2021, 3:25 p.m.
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

-- 
2.29.2

Comments

Nick Clifton via Binutils Feb. 15, 2021, 3:43 p.m. | #1
On Sat, Feb 13, 2021 at 7:25 AM H.J. Lu <hjl.tools@gmail.com> wrote:
>

> 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

>


Nick, Alan,

Any comments on this patch?

-- 
H.J.
Nick Clifton via Binutils Feb. 15, 2021, 11:28 p.m. | #2
On Mon, Feb 15, 2021 at 07:43:39AM -0800, H.J. Lu wrote:
> On Sat, Feb 13, 2021 at 7:25 AM H.J. Lu <hjl.tools@gmail.com> wrote:

> >

> > 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.  */


Should you be using generic_attr in later tests in this block?  If we
allow .rodata.str with a differing SHF_MERGE flag then it seems
reasonable to also allow SHF_GNU_RETAIN to differ.

> > 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

> >

> 

> Nick, Alan,

> 

> Any comments on this patch?

> 

> -- 

> H.J.


-- 
Alan Modra
Australia Development Lab, IBM

Patch

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