[PATCH] x86-64: Convert load to mov only for GOTPCRELX relocations

H.J. Lu hjl.tools@gmail.com
Sat Dec 5 03:00:36 GMT 2020


On Fri, Dec 4, 2020 at 6:57 PM H.J. Lu <hjl.tools@gmail.com> wrote:
>
> Since converting load to mov needs to rewrite the REX byte and we don't
> know if there is a REX byte with GOTPCREL relocation, do it only for
> GOTPCRELX relocations.
>
> bfd/
>
>         PR ld/27016
>         * elf64-x86-64.c (elf_x86_64_convert_load_reloc): Convert load
>         to mov only for GOTPCRELX relocations.
>
> ld/
>
>         PR ld/27016
>         * testsuite/ld-x86-64/x86-64.exp: Run pr27016a and pr27016b.
>         * testsuite/ld-x86-64/pr27016a.d: New file.
>         * testsuite/ld-x86-64/pr27016a.s: Likewise.
>         * testsuite/ld-x86-64/pr27016b.d: Likewise.
>         * testsuite/ld-x86-64/pr27016b.s: Likewise.
> ---
>  bfd/ChangeLog                     |  6 ++++++
>  bfd/elf64-x86-64.c                |  2 +-
>  ld/ChangeLog                      |  9 +++++++++
>  ld/testsuite/ld-x86-64/pr27016a.d | 23 +++++++++++++++++++++++
>  ld/testsuite/ld-x86-64/pr27016a.s | 23 +++++++++++++++++++++++
>  ld/testsuite/ld-x86-64/pr27016b.d | 23 +++++++++++++++++++++++
>  ld/testsuite/ld-x86-64/pr27016b.s |  4 ++++
>  ld/testsuite/ld-x86-64/x86-64.exp |  2 ++
>  8 files changed, 91 insertions(+), 1 deletion(-)
>  create mode 100644 ld/testsuite/ld-x86-64/pr27016a.d
>  create mode 100644 ld/testsuite/ld-x86-64/pr27016a.s
>  create mode 100644 ld/testsuite/ld-x86-64/pr27016b.d
>  create mode 100644 ld/testsuite/ld-x86-64/pr27016b.s
>
> diff --git a/bfd/ChangeLog b/bfd/ChangeLog
> index fa29df2267..2d1e4da18f 100644
> --- a/bfd/ChangeLog
> +++ b/bfd/ChangeLog
> @@ -1,3 +1,9 @@
> +2020-12-04  H.J. Lu  <hongjiu.lu@intel.com>
> +
> +       PR ld/27016
> +       * elf64-x86-64.c (elf_x86_64_convert_load_reloc): Convert load
> +       to mov only for GOTPCRELX relocations.
> +
>  2020-12-04  Alan Modra  <amodra@gmail.com>
>
>         PR 26978
> diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c
> index 549a8be6a6..bb33967171 100644
> --- a/bfd/elf64-x86-64.c
> +++ b/bfd/elf64-x86-64.c
> @@ -1731,7 +1731,7 @@ elf_x86_64_convert_load_reloc (bfd *abfd,
>
>        if (opcode == 0x8b)
>         {
> -         if (abs_symbol && local_ref)
> +         if (abs_symbol && local_ref && relocx)
>             to_reloc_pc32 = FALSE;
>
>           if (to_reloc_pc32)
> diff --git a/ld/ChangeLog b/ld/ChangeLog
> index 0bbb576c56..f33bd41b01 100644
> --- a/ld/ChangeLog
> +++ b/ld/ChangeLog
> @@ -1,3 +1,12 @@
> +2020-12-04  H.J. Lu  <hongjiu.lu@intel.com>
> +
> +       PR ld/27016
> +       * testsuite/ld-x86-64/x86-64.exp: Run pr27016a and pr27016b.
> +       * testsuite/ld-x86-64/pr27016a.d: New file.
> +       * testsuite/ld-x86-64/pr27016a.s: Likewise.
> +       * testsuite/ld-x86-64/pr27016b.d: Likewise.
> +       * testsuite/ld-x86-64/pr27016b.s: Likewise.
> +
>  2020-12-04  Alan Modra  <amodra@gmail.com>
>
>         * testsuite/ld-elf/pr26978a.d,
> diff --git a/ld/testsuite/ld-x86-64/pr27016a.d b/ld/testsuite/ld-x86-64/pr27016a.d
> new file mode 100644
> index 0000000000..88fba0a37f
> --- /dev/null
> +++ b/ld/testsuite/ld-x86-64/pr27016a.d
> @@ -0,0 +1,23 @@
> +#source: pr27016a.s
> +#source: pr27016b.s
> +#as: --64 -mx86-used-note=no -mrelax-relocations=no
> +#ld: -m elf_x86_64 -z max-page-size=0x200000 -z noseparate-code -e main
> +#objdump: -dw
> +
> +.*: +file format .*
> +
> +
> +Disassembly of section .text:
> +
> +0+4000e8 <main>:
> + +[a-f0-9]+:   55                      push   %rbp
> + +[a-f0-9]+:   48 89 e5                mov    %rsp,%rbp
> + +[a-f0-9]+:   4c 8d 1d 39 3f 00 00    lea    0x3f39\(%rip\),%r11        # 40402c <thesym>
> + +[a-f0-9]+:   41 8b 03                mov    \(%r11\),%eax
> + +[a-f0-9]+:   8d 50 01                lea    0x1\(%rax\),%edx
> + +[a-f0-9]+:   4c 8d 1d 2c 3f 00 00    lea    0x3f2c\(%rip\),%r11        # 40402c <thesym>
> + +[a-f0-9]+:   41 89 13                mov    %edx,\(%r11\)
> + +[a-f0-9]+:   b8 00 00 00 00          mov    \$0x0,%eax
> + +[a-f0-9]+:   5d                      pop    %rbp
> + +[a-f0-9]+:   c3                      ret
> +#pass
> diff --git a/ld/testsuite/ld-x86-64/pr27016a.s b/ld/testsuite/ld-x86-64/pr27016a.s
> new file mode 100644
> index 0000000000..b64851a5ff
> --- /dev/null
> +++ b/ld/testsuite/ld-x86-64/pr27016a.s
> @@ -0,0 +1,23 @@
> +        .text
> +        .comm   global_int,4,4
> +        .globl  main
> +        .type   main, @function
> +main:
> +        .cfi_startproc
> +        pushq   %rbp
> +        .cfi_def_cfa_offset 16
> +        .cfi_offset 6, -16
> +        movq    %rsp, %rbp
> +        .cfi_def_cfa_register 6
> +        movq    thesym@GOTPCREL(%rip), %r11
> +        movl    (%r11), %eax
> +        leal    1(%rax), %edx
> +        movq    thesym@GOTPCREL(%rip), %r11
> +        movl    %edx, (%r11)
> +        movl    $0, %eax
> +        popq    %rbp
> +        .cfi_def_cfa 7, 8
> +        ret
> +        .cfi_endproc
> +        .size   main, .-main
> +        .section        .note.GNU-stack,"",@progbits
> diff --git a/ld/testsuite/ld-x86-64/pr27016b.d b/ld/testsuite/ld-x86-64/pr27016b.d
> new file mode 100644
> index 0000000000..b172736321
> --- /dev/null
> +++ b/ld/testsuite/ld-x86-64/pr27016b.d
> @@ -0,0 +1,23 @@
> +#source: pr27016a.s
> +#source: pr27016b.s
> +#as: --64 -mx86-used-note=no -mrelax-relocations=yes
> +#ld: -m elf_x86_64 -z max-page-size=0x200000 -z noseparate-code -e main
> +#objdump: -dw
> +
> +.*: +file format .*
> +
> +
> +Disassembly of section .text:
> +
> +0+4000e8 <main>:
> + +[a-f0-9]+:   55                      push   %rbp
> + +[a-f0-9]+:   48 89 e5                mov    %rsp,%rbp
> + +[a-f0-9]+:   49 c7 c3 2c 40 40 00    mov    \$0x40402c,%r11
> + +[a-f0-9]+:   41 8b 03                mov    \(%r11\),%eax
> + +[a-f0-9]+:   8d 50 01                lea    0x1\(%rax\),%edx
> + +[a-f0-9]+:   49 c7 c3 2c 40 40 00    mov    \$0x40402c,%r11
> + +[a-f0-9]+:   41 89 13                mov    %edx,\(%r11\)
> + +[a-f0-9]+:   b8 00 00 00 00          mov    \$0x0,%eax
> + +[a-f0-9]+:   5d                      pop    %rbp
> + +[a-f0-9]+:   c3                      ret
> +#pass
> diff --git a/ld/testsuite/ld-x86-64/pr27016b.s b/ld/testsuite/ld-x86-64/pr27016b.s
> new file mode 100644
> index 0000000000..ded8d7a826
> --- /dev/null
> +++ b/ld/testsuite/ld-x86-64/pr27016b.s
> @@ -0,0 +1,4 @@
> +       .globl thesym
> +thesym = 0x40402c
> +
> +       .section        .note.GNU-stack,"",@progbits
> diff --git a/ld/testsuite/ld-x86-64/x86-64.exp b/ld/testsuite/ld-x86-64/x86-64.exp
> index 99c8a33c3e..41d385bf05 100644
> --- a/ld/testsuite/ld-x86-64/x86-64.exp
> +++ b/ld/testsuite/ld-x86-64/x86-64.exp
> @@ -661,6 +661,8 @@ run_dump_test "pr22048"
>  run_dump_test "pr22929"
>  run_dump_test "pr26939"
>  run_dump_test "pr26939-x32"
> +run_dump_test "pr27016a"
> +run_dump_test "pr27016b"
>
>  proc undefined_weak {cflags ldflags} {
>      set testname "Undefined weak symbol"
> --
> 2.28.0
>

I am backporting it to 2.35 branch.

-- 
H.J.


More information about the Binutils mailing list