From 7e45e7a9ab38ee904ca62ed9934e933fdb1d6e9c Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Fri, 4 Dec 2020 18:54:47 -0800 Subject: [PATCH] x86-64: Convert load to mov only for GOTPCRELX relocations 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 fa29df22676..2d1e4da18f2 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,9 @@ +2020-12-04 H.J. Lu + + 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 PR 26978 diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c index 549a8be6a6a..bb339671717 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 0bbb576c562..f33bd41b01b 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,12 @@ +2020-12-04 H.J. Lu + + 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 * 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 00000000000..88fba0a37f4 --- /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
: + +[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 + +[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 + +[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 00000000000..b64851a5ffb --- /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 00000000000..b1727363212 --- /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
: + +[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 00000000000..ded8d7a826c --- /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 99c8a33c3e3..41d385bf058 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.30.2