[PATCH] x86: Change PLT32 reloc against section to PC32
H.J. Lu
hjl.tools@gmail.com
Sun Jul 19 13:48:43 GMT 2020
Commit 292676c1 resolved PLT32 reloc aganst local symbol to section.
Since PLT32 relocation must be against symbols, turn such PLT32
relocation into PC32 relocation.
gas/
PR gas/26263
* config/tc-i386.c (i386_validate_fix): Change PLT32 reloc
against section to PC32 reloc.
* testsuite/gas/i386/relax-5.d: Updated.
* testsuite/gas/i386/x86-64-relax-4.d: Likewise.
ld/
PR gas/26263
* testsuite/ld-i386/i386.exp: Run PR gas/26263 test.
* testsuite/ld-x86-64/x86-64.exp: Likewise.
* testsuite/ld-i386/pr26263.d: New file.
* testsuite/ld-x86-64/pr26263.d: Likewise.
* testsuite/ld-x86-64/pr26263.s: Likewise.
---
gas/config/tc-i386.c | 19 +++++++++++++++----
gas/testsuite/gas/i386/relax-5.d | 2 +-
gas/testsuite/gas/i386/x86-64-relax-4.d | 2 +-
ld/testsuite/ld-i386/i386.exp | 1 +
ld/testsuite/ld-i386/pr26263.d | 19 +++++++++++++++++++
ld/testsuite/ld-x86-64/pr26263.d | 18 ++++++++++++++++++
ld/testsuite/ld-x86-64/pr26263.s | 8 ++++++++
ld/testsuite/ld-x86-64/x86-64.exp | 1 +
8 files changed, 64 insertions(+), 6 deletions(-)
create mode 100644 ld/testsuite/ld-i386/pr26263.d
create mode 100644 ld/testsuite/ld-x86-64/pr26263.d
create mode 100644 ld/testsuite/ld-x86-64/pr26263.s
diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c
index 192c5e1ae3..a9c79f1550 100644
--- a/gas/config/tc-i386.c
+++ b/gas/config/tc-i386.c
@@ -13849,11 +13849,22 @@ i386_validate_fix (fixS *fixp)
}
}
#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
- else if (!object_64bit)
+ else
{
- if (fixp->fx_r_type == BFD_RELOC_386_GOT32
- && fixp->fx_tcbit2)
- fixp->fx_r_type = BFD_RELOC_386_GOT32X;
+ /* 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. */
+ if (fixp->fx_addsy
+ && (fixp->fx_r_type == BFD_RELOC_386_PLT32
+ || fixp->fx_r_type == BFD_RELOC_X86_64_PLT32)
+ && symbol_section_p (fixp->fx_addsy))
+ fixp->fx_r_type = BFD_RELOC_32_PCREL;
+ if (!object_64bit)
+ {
+ if (fixp->fx_r_type == BFD_RELOC_386_GOT32
+ && fixp->fx_tcbit2)
+ fixp->fx_r_type = BFD_RELOC_386_GOT32X;
+ }
}
#endif
}
diff --git a/gas/testsuite/gas/i386/relax-5.d b/gas/testsuite/gas/i386/relax-5.d
index bccfe681a0..c3771330b2 100644
--- a/gas/testsuite/gas/i386/relax-5.d
+++ b/gas/testsuite/gas/i386/relax-5.d
@@ -10,6 +10,6 @@ Disassembly of section .text:
Disassembly of section .init.text:
0+ <foo>:
- +[a-f0-9]+: e8 fb ff ff ff call 0 <foo> 1: R_386_PLT32 .text
+ +[a-f0-9]+: e8 fc ff ff ff call 1 <foo\+0x1> 1: R_386_PC32 .text
+[a-f0-9]+: e8 fc ff ff ff call 6 <foo\+0x6> 6: R_386_PC32 .text
#pass
diff --git a/gas/testsuite/gas/i386/x86-64-relax-4.d b/gas/testsuite/gas/i386/x86-64-relax-4.d
index 594f95ae3e..ca12c0383b 100644
--- a/gas/testsuite/gas/i386/x86-64-relax-4.d
+++ b/gas/testsuite/gas/i386/x86-64-relax-4.d
@@ -12,6 +12,6 @@ Disassembly of section .text:
Disassembly of section .init.text:
0+ <foo>:
- +[a-f0-9]+: e8 00 00 00 00 call 5 <foo\+0x5> 1: R_X86_64_PLT32 .text-0x4
+ +[a-f0-9]+: e8 00 00 00 00 call 5 <foo\+0x5> 1: R_X86_64_PC32 .text-0x4
+[a-f0-9]+: 48 8d 05 00 00 00 00 lea 0x0\(%rip\),%rax # c <foo\+0xc> 8: R_X86_64_PC32 .text-0x4
#pass
diff --git a/ld/testsuite/ld-i386/i386.exp b/ld/testsuite/ld-i386/i386.exp
index e51981a38d..164c099cbb 100644
--- a/ld/testsuite/ld-i386/i386.exp
+++ b/ld/testsuite/ld-i386/i386.exp
@@ -469,6 +469,7 @@ run_dump_test "pr24322a"
run_dump_test "pr24322b"
run_dump_test "align-branch-1"
run_dump_test "pr26018"
+run_dump_test "pr26263"
if { !([istarget "i?86-*-linux*"]
|| [istarget "i?86-*-gnu*"]
diff --git a/ld/testsuite/ld-i386/pr26263.d b/ld/testsuite/ld-i386/pr26263.d
new file mode 100644
index 0000000000..8cf7c15a66
--- /dev/null
+++ b/ld/testsuite/ld-i386/pr26263.d
@@ -0,0 +1,19 @@
+#source: ../ld-x86-64/pr26263.s
+#as: --32
+#ld: -shared -melf_i386
+#objdump: -dw
+
+.*: +file format .*
+
+
+Disassembly of section .text:
+
+0+1000 <printk>:
+ +[a-f0-9]+: c3 ret
+
+Disassembly of section .init.text:
+
+0+1001 <foo>:
+ +[a-f0-9]+: e8 fa ff ff ff call 1000 <printk>
+ +[a-f0-9]+: e8 f5 ff ff ff call 1000 <printk>
+#pass
diff --git a/ld/testsuite/ld-x86-64/pr26263.d b/ld/testsuite/ld-x86-64/pr26263.d
new file mode 100644
index 0000000000..375218c3e9
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/pr26263.d
@@ -0,0 +1,18 @@
+#as: --64
+#ld: -m elf_x86_64 -shared
+#objdump: -dw
+
+.*: +file format .*
+
+
+Disassembly of section .text:
+
+0+1000 <printk>:
+ +[a-f0-9]+: c3 ret
+
+Disassembly of section .init.text:
+
+0+1001 <foo>:
+ +[a-f0-9]+: e8 fa ff ff ff call 1000 <printk>
+ +[a-f0-9]+: e8 f5 ff ff ff call 1000 <printk>
+#pass
diff --git a/ld/testsuite/ld-x86-64/pr26263.s b/ld/testsuite/ld-x86-64/pr26263.s
new file mode 100644
index 0000000000..5a3332cd5e
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/pr26263.s
@@ -0,0 +1,8 @@
+ .section .init.text,"ax",@progbits
+ .global foo
+foo:
+ call printk
+ call printk@PLT
+ .text
+printk:
+ ret
diff --git a/ld/testsuite/ld-x86-64/x86-64.exp b/ld/testsuite/ld-x86-64/x86-64.exp
index e687c42a69..21aa6a06ef 100644
--- a/ld/testsuite/ld-x86-64/x86-64.exp
+++ b/ld/testsuite/ld-x86-64/x86-64.exp
@@ -640,6 +640,7 @@ run_dump_test "pr20253-5b"
run_dump_test "tlsdesc2"
run_dump_test "pr22048"
run_dump_test "pr22929"
+run_dump_test "pr26263"
proc undefined_weak {cflags ldflags} {
set testname "Undefined weak symbol"
--
2.26.2
More information about the Binutils
mailing list