x86-64: Convert load to mov only for GOTPCRELX relocations
authorH.J. Lu <hjl.tools@gmail.com>
Sat, 5 Dec 2020 02:54:47 +0000 (18:54 -0800)
committerH.J. Lu <hjl.tools@gmail.com>
Sat, 5 Dec 2020 02:54:47 +0000 (18:54 -0800)
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
bfd/elf64-x86-64.c
ld/ChangeLog
ld/testsuite/ld-x86-64/pr27016a.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/pr27016a.s [new file with mode: 0644]
ld/testsuite/ld-x86-64/pr27016b.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/pr27016b.s [new file with mode: 0644]
ld/testsuite/ld-x86-64/x86-64.exp

index fa29df22676b81fde81c191c4cb940308dea9bab..2d1e4da18f2d65262f380e154c0952c8c952278d 100644 (file)
@@ -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
index 549a8be6a6a8df4899b40f3d6fa089073bce3ae0..bb339671717be2b8c8bd7cf3a776bce5b7ac3af5 100644 (file)
@@ -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)
index 0bbb576c56286698c2e30d0cd28ac399a8655abf..f33bd41b01b679a43829c99a141ad80f0e21d340 100644 (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,
diff --git a/ld/testsuite/ld-x86-64/pr27016a.d b/ld/testsuite/ld-x86-64/pr27016a.d
new file mode 100644 (file)
index 0000000..88fba0a
--- /dev/null
@@ -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 (file)
index 0000000..b64851a
--- /dev/null
@@ -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 (file)
index 0000000..b172736
--- /dev/null
@@ -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 (file)
index 0000000..ded8d7a
--- /dev/null
@@ -0,0 +1,4 @@
+       .globl thesym
+thesym = 0x40402c
+
+       .section        .note.GNU-stack,"",@progbits
index 99c8a33c3e3c520d7658b34c37839457bc7b602e..41d385bf058c083ed29aa1193650c9ed4edfab28 100644 (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"