[PATCH] gas: Allow SHF_GNU_RETAIN on SHT_NOTE section
Alan Modra
amodra@gmail.com
Mon Feb 15 23:28:52 GMT 2021
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
More information about the Binutils
mailing list