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.
This commit is contained in:
H.J. Lu 2020-12-04 18:54:47 -08:00
parent 4979ae6a9e
commit 7e45e7a9ab
8 changed files with 91 additions and 1 deletions

View file

@ -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,

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -0,0 +1,4 @@
.globl thesym
thesym = 0x40402c
.section .note.GNU-stack,"",@progbits

View file

@ -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"