[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