[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