]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
x86-64: Never make R_X86_64_GOT64 section relative
authorH.J. Lu <hjl.tools@gmail.com>
Thu, 19 Sep 2024 21:37:04 +0000 (05:37 +0800)
committerH.J. Lu <hjl.tools@gmail.com>
Thu, 19 Sep 2024 21:44:35 +0000 (05:44 +0800)
R_X86_64_GOT64 relocation should never be made section relative.  Change
tc_i386_fix_adjustable to return 0 for BFD_RELOC_X86_64_GOT64.

gas/

PR gas/32189
* config/tc-i386.c (tc_i386_fix_adjustable): Return 0 for
BFD_RELOC_X86_64_GOT64.
* testsuite/gas/i386/reloc64.d: Updated.
* testsuite/gas/i386/reloc64.s: Add more tests for R_X86_64_GOT64
and R_X86_64_GOTOFF64.

ld/

PR gas/32189
* testsuite/ld-x86-64/x86-64.exp: Run PR gas/32189 test.
* testsuite/ld-x86-64/pr32189.s: New file.

Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
gas/config/tc-i386.c
gas/testsuite/gas/i386/reloc64.d
gas/testsuite/gas/i386/reloc64.s
ld/testsuite/ld-x86-64/pr32189.s [new file with mode: 0644]
ld/testsuite/ld-x86-64/x86-64.exp

index 4739a6d0c21a1717b1507fc206bab7a0476a6c4c..72de448728a39eea0f6f1f3bf4c184f141418adf 100644 (file)
@@ -3893,6 +3893,7 @@ tc_i386_fix_adjustable (fixS *fixP)
       || fixP->fx_r_type == BFD_RELOC_X86_64_TPOFF32
       || fixP->fx_r_type == BFD_RELOC_X86_64_TPOFF64
       || fixP->fx_r_type == BFD_RELOC_X86_64_GOTOFF64
+      || fixP->fx_r_type == BFD_RELOC_X86_64_GOT64
       || fixP->fx_r_type == BFD_RELOC_X86_64_GOTPC32_TLSDESC
       || fixP->fx_r_type == BFD_RELOC_X86_64_CODE_4_GOTPC32_TLSDESC
       || fixP->fx_r_type == BFD_RELOC_X86_64_TLSDESC_CALL
index 540a9b77d350aea4190fb008e8558b69cda536d9..a96072d66fb69af56209c36c8fee76ad079b62ad 100644 (file)
@@ -57,6 +57,8 @@ Disassembly of section \.text:
 .*[    ]+R_X86_64_32[  ]+xtrn
 .*[    ]+R_X86_64_32S[         ]+xtrn
 .*[    ]+R_X86_64_32[  ]+xtrn
+.*[    ]+R_X86_64_GOT64[       ]+ptr
+.*[    ]+R_X86_64_GOTOFF64[    ]+Ldst
 Disassembly of section \.data:
 #...
 .*[    ]+R_X86_64_64[  ]+xtrn
@@ -97,3 +99,8 @@ Disassembly of section \.data:
 .*[    ]+R_X86_64_GOT32[       ]+xtrn-0x4
 .*[    ]+R_X86_64_GOT32[       ]+xtrn\+0x4
 .*[    ]+R_X86_64_GOTPLT64[    ]+xtrn
+
+.* <ptr>:
+       ...
+.* <Ldst>:
+       ...
index bc6f0fa6cc31198b5a7618e49c208b985208011c..2293865df20bd2be541021bf5d728cf52eb01987 100644 (file)
@@ -225,3 +225,12 @@ bad        .byte   xtrn@gotplt
        vgatherdps %xmm2, xtrn(,%xmm1), %xmm0
        addr32 vgatherdps %xmm2, xtrn(,%xmm1), %xmm0
 bad    .long   xtrn@plt - .
+
+       .text
+       movabs  $ptr@GOT, %rax
+       movabs  $Ldst@GOTOFF, %rdx
+       .data
+ptr:
+       .quad 0
+Ldst:
+       .quad 0
diff --git a/ld/testsuite/ld-x86-64/pr32189.s b/ld/testsuite/ld-x86-64/pr32189.s
new file mode 100644 (file)
index 0000000..3d0f682
--- /dev/null
@@ -0,0 +1,35 @@
+       .text
+       .global _start
+_start:
+       leaq 1f(%rip), %r11
+1:
+       movabs $_GLOBAL_OFFSET_TABLE_, %r15
+       leaq (%r11,%r15), %r15
+
+       movabs $ptr@GOT, %rax
+       movabs $Ldst@GOTOFF, %rdx
+       movq (%rax,%r15), %rax
+       leaq (%rdx,%r15), %rcx
+       movq %rcx, (%rax)
+
+       # Write out "PASS\n".
+       movl    $5, %edx
+       movl    $.LC0, %esi
+       movl    $1, %edi
+       movl    $1, %eax
+       syscall
+
+       # exit
+       movq $60, %rax
+       movq $0, %rdi
+       syscall
+
+       .data
+Ldst:
+       .quad 0
+ptr:
+       .quad 0
+       .section        .rodata.str1.1,"aMS",@progbits,1
+.LC0:
+       .string "PASS\n"
+       .section        .note.GNU-stack,"",@progbits
index e729b69a7cd08af6cb659a93a7adc8276605bb7f..c203fbe4037e9d8eb9ff83016405a725b1c3100f 100644 (file)
@@ -1921,6 +1921,14 @@ if { [isnative] && [check_compiler_available] } {
            "pass.out" \
            "-fPIE" \
        ] \
+       [list \
+           "Run pr32189" \
+           "-nostdlib -nostartfiles" \
+           "" \
+           { pr32189.s } \
+           "pr32189" \
+           "pass.out" \
+       ] \
     ]
 
     # Run-time tests which require working ifunc attribute support.