[PATCH] gas: Allow SHF_GNU_RETAIN on SHT_NOTE section
H.J. Lu
hjl.tools@gmail.com
Mon Feb 15 15:43:39 GMT 2021
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.
More information about the Binutils
mailing list