Message ID | 20210213152520.899804-1-hjl.tools@gmail.com |
---|---|
State | New |
Headers | show |
Series |
|
Related | show |
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.
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
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