]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
x86: Turn PLT32 to PC32 only for PC-relative relocations
authorH.J. Lu <hjl.tools@gmail.com>
Sun, 22 Sep 2024 09:06:45 +0000 (17:06 +0800)
committerH.J. Lu <hjl.tools@gmail.com>
Sun, 22 Sep 2024 19:45:19 +0000 (03:45 +0800)
commit 292676c15a615b5a95bede9ee91004d3f7ee7dfd
Author: H.J. Lu <hjl.tools@gmail.com>
Date:   Thu Feb 13 13:44:17 2020 -0800

    x86: Resolve PLT32 reloc aganst local symbol to section

resolved PLT32 relocation against local symbol to section and

commit 2585b7a5ce5830e60a089aa2316a329558902f0c
Author: H.J. Lu <hjl.tools@gmail.com>
Date:   Sun Jul 19 06:51:19 2020 -0700

    x86: Change PLT32 reloc against section to PC32

turned PLT32 relocation against section into PC32 relocation.  But these
transformations are valid only for PC-relative relocations.  Add fx_pcrel
check for PC-relative relocations when performing these transformations
to keep PLT32 relocation in `movq $foo@PLT, %rax`.

gas/

PR gas/32196
* config/tc-i386.c (tc_i386_fix_adjustable): Return fixP->fx_pcrel
for PLT32 relocations.
(i386_validate_fix): Turn PLT32 relocation into PC32 relocation
only if fixp->fx_pcrel is set.
* testsuite/gas/i386/reloc32.d: Updated.
* testsuite/gas/i386/reloc64.d: Likewise.
* testsuite/gas/i386/reloc32.s: Add PR gas/32196 test.
* testsuite/gas/i386/reloc64.s: Likewise.

ld/

PR gas/32196
* testsuite/ld-x86-64/plt3.s: New file.
* testsuite/ld-x86-64/x86-64.exp: Run plt3.

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

index 11565ac7cb07ba1ef34013f23d613c9032b85066..864a38a9a208415da34fb766a817ef13a66a0d95 100644 (file)
@@ -3930,6 +3930,11 @@ tc_i386_fix_adjustable (fixS *fixP)
       || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
       || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
     return 0;
+  /* Resolve PLT32 relocation against local symbol to section only for
+     PC-relative relocations.  */
+  if (fixP->fx_r_type == BFD_RELOC_386_PLT32
+      || fixP->fx_r_type == BFD_RELOC_X86_64_PLT32)
+    return fixP->fx_pcrel;
   return 1;
 }
 #endif
@@ -17792,8 +17797,12 @@ i386_validate_fix (fixS *fixp)
     {
       /* NB: Commit 292676c1 resolved PLT32 reloc aganst local symbol
         to section.  Since PLT32 relocation must be against symbols,
-        turn such PLT32 relocation into PC32 relocation.  */
+        turn such PLT32 relocation into PC32 relocation.  NB: We can
+        turn PLT32 relocation into PC32 relocation only for PC-relative
+        relocations since non-PC-relative relocations need PLT entries.
+       */
       if (fixp->fx_addsy
+         && fixp->fx_pcrel
          && (fixp->fx_r_type == BFD_RELOC_386_PLT32
              || fixp->fx_r_type == BFD_RELOC_X86_64_PLT32)
          && symbol_section_p (fixp->fx_addsy))
index 7d1b1ba2ae012432659a2d328dfa10cc0169866b..ebac545b20095fed6fecc7c703845fe26e572346 100644 (file)
@@ -43,6 +43,7 @@ Disassembly of section \.text:
 .*[    ]+R_386_TLS_LE[         ]+xtrn
 .*[    ]+R_386_TLS_LE_32[      ]+xtrn
 .*[    ]+R_386_TLS_LE_32[      ]+xtrn
+.*[    ]+R_386_PLT32[  ]+ptr
 Disassembly of section \.data:
 #...
 .*[    ]+R_386_32[     ]+xtrn
index e766a3dcc258f9a4bcc74cecf213399a8f63cf41..5616cd57e3f22363902faf93313bee3fb3dd797d 100644 (file)
@@ -162,3 +162,10 @@ bad        .byte   xtrn@tpoff
        .long   xtrn@got + 4
        .long   xtrn@got - 4
 bad    .long   xtrn@plt - .
+
+       .text
+       movl    $ptr@PLT, %eax
+
+       .data
+ptr:
+       .dc.a 0
index 665ede6f264aded51cd2e3c8b80ffb1ed507572f..5fee029e56afe4d1c6a4b077561070898eebf65a 100644 (file)
@@ -59,6 +59,7 @@ Disassembly of section \.text:
 .*[    ]+R_X86_64_32[  ]+xtrn
 .*[    ]+R_X86_64_GOT64[       ]+ptr
 .*[    ]+R_X86_64_GOTOFF64[    ]+Ldst
+.*[    ]+R_X86_64_PLT32[       ]+ptr
 Disassembly of section \.data:
 #...
 .*[    ]+R_X86_64_64[  ]+xtrn
index 2293865df20bd2be541021bf5d728cf52eb01987..5c0f4136a09f4e27b817788654d21c393a9bc026 100644 (file)
@@ -229,6 +229,8 @@ bad .long   xtrn@plt - .
        .text
        movabs  $ptr@GOT, %rax
        movabs  $Ldst@GOTOFF, %rdx
+       movq    $ptr@PLT, %rax
+
        .data
 ptr:
        .quad 0
diff --git a/ld/testsuite/ld-x86-64/plt3.s b/ld/testsuite/ld-x86-64/plt3.s
new file mode 100644 (file)
index 0000000..c3a29b5
--- /dev/null
@@ -0,0 +1,27 @@
+       .text
+       .global _start
+_start:
+       movq $foo@PLT, %rax
+       leaq -11(%rip), %rbx
+       leaq (%rbx, %rax), %rax
+       call *%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
+
+foo:
+       ret
+
+       .section        .rodata.str1.1,"aMS",@progbits,1
+.LC0:
+       .string "PASS\n"
+       .section        .note.GNU-stack,"",@progbits
index cf78fffe29f642bccb0a115f1818ffb0963ba300..1a6754dc31fd380bb55f4fb6a90b5de6a4606d16 100644 (file)
@@ -1929,6 +1929,14 @@ if { [isnative] && [check_compiler_available] } {
            "pr32189" \
            "pass.out" \
        ] \
+       [list \
+           "Run plt3" \
+           "$NOPIE_LDFLAGS -nostdlib -nostartfiles" \
+           "" \
+           { plt3.s } \
+           "plt3" \
+           "pass.out" \
+       ] \
     ]
 
     # Run-time tests which require working ifunc attribute support.