PATCH: PR ld/13581: R_X86_64_PC32 against global symbol can't be used for PIC on x32

H.J. Lu hongjiu.lu@intel.com
Tue Jan 10 20:20:00 GMT 2012


We can't use R_X86_64_PC32 against global symbol for PIC on x32 since
address may overflow 32bit range.  I checked this patch into mainline
and will backport it to 2.22 branch.


H.J.
----
bfd/

2012-01-10  H.J. Lu  <hongjiu.lu@intel.com>

	PR ld/13581
	* elf64-x86-64.c (elf_x86_64_relocate_section): Remove ABI_64_P
	check on R_X86_64_PCXX.

ld/testsuite/

2012-01-10  H.J. Lu  <hongjiu.lu@intel.com>

	PR ld/13581
	* ld-x86-64/ilp32-4.s: New.
	* ld-x86-64/ilp32-10.d: Likewise.
	* ld-x86-64/ilp32-10.s: Likewise.

	* ld-x86-64/ilp32-4.d: Adjusted.
	* ld-x86-64/ilp32-5.d: Likewise.
	* ld-x86-64/ilp32-5.s: Likewise.

	* ld-x86-64/x86-64.exp: Run ilp32-10.

diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c
index 25c14a8..814736e 100644
--- a/bfd/elf64-x86-64.c
+++ b/bfd/elf64-x86-64.c
@@ -3472,7 +3472,6 @@ elf_x86_64_relocate_section (bfd *output_bfd,
 	case R_X86_64_PC16:
 	case R_X86_64_PC32:
 	  if (info->shared
-	      && ABI_64_P (output_bfd)
 	      && (input_section->flags & SEC_ALLOC) != 0
 	      && (input_section->flags & SEC_READONLY) != 0
 	      && h != NULL)
diff --git a/ld/testsuite/ld-x86-64/ilp32-10.d b/ld/testsuite/ld-x86-64/ilp32-10.d
new file mode 100644
index 0000000..43d9fbd
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/ilp32-10.d
@@ -0,0 +1,3 @@
+#as: --x32
+#ld: -shared -melf32_x86_64
+#error: .*relocation R_X86_64_PC32 against undefined symbol `bar' can not be used when making a shared object; recompile with -fPIC
diff --git a/ld/testsuite/ld-x86-64/ilp32-10.s b/ld/testsuite/ld-x86-64/ilp32-10.s
new file mode 100644
index 0000000..70e4a90
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/ilp32-10.s
@@ -0,0 +1,3 @@
+	.globl foo
+foo:
+	mov bar(%rip), %rax
diff --git a/ld/testsuite/ld-x86-64/ilp32-4.d b/ld/testsuite/ld-x86-64/ilp32-4.d
index 84dc7b2..92d8a67 100644
--- a/ld/testsuite/ld-x86-64/ilp32-4.d
+++ b/ld/testsuite/ld-x86-64/ilp32-4.d
@@ -1,36 +1,30 @@
-#source: start.s
 #as: --x32
 #ld: -m elf32_x86_64 -shared --no-ld-generated-unwind-info
 #readelf: -d -S --wide
 
-There are 10 section headers, starting at offset 0x22c:
+There are 9 section headers, starting at offset 0x1d8:
 
 Section Headers:
   \[Nr\] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
   \[ 0\]                   NULL            00000000 000000 000000 00      0   0  0
-  \[ 1\] .hash             HASH            00000094 000094 000030 04   A  2   0  4
-  \[ 2\] .dynsym           DYNSYM          000000c4 0000c4 000070 10   A  3   2  4
-  \[ 3\] .dynstr           STRTAB          00000134 000134 00001d 00   A  0   0  1
-  \[ 4\] .rela.dyn         RELA            00000154 000154 00000c 0c   A  2   0  4
-  \[ 5\] .text             PROGBITS        00000160 000160 000005 00  AX  0   0  4
-  \[ 6\] .dynamic          DYNAMIC         00200168 000168 000078 08  WA  3   0  4
-  \[ 7\] .shstrtab         STRTAB          00000000 0001e0 00004a 00      0   0  1
-  \[ 8\] .symtab           SYMTAB          00000000 0003bc 0000e0 10      9   9  4
-  \[ 9\] .strtab           STRTAB          00000000 00049c 000043 00      0   0  1
+  \[ 1\] .hash             HASH            00000094 000094 00002c 04   A  2   0  4
+  \[ 2\] .dynsym           DYNSYM          000000c0 0000c0 000060 10   A  3   2  4
+  \[ 3\] .dynstr           STRTAB          00000120 000120 000019 00   A  0   0  1
+  \[ 4\] .text             PROGBITS        0000013c 00013c 000001 00  AX  0   0  4
+  \[ 5\] .dynamic          DYNAMIC         00200140 000140 000058 08  WA  3   0  4
+  \[ 6\] .shstrtab         STRTAB          00000000 000198 000040 00      0   0  1
+  \[ 7\] .symtab           SYMTAB          00000000 000340 0000c0 10      8   8  4
+  \[ 8\] .strtab           STRTAB          00000000 000400 00003f 00      0   0  1
 Key to Flags:
   W \(write\), A \(alloc\), X \(execute\), M \(merge\), S \(strings\), l \(large\)
   I \(info\), L \(link order\), G \(group\), T \(TLS\), E \(exclude\), x \(unknown\)
   O \(extra OS processing required\) o \(OS specific\), p \(processor specific\)
 
-Dynamic section at offset 0x168 contains 10 entries:
+Dynamic section at offset 0x140 contains 6 entries:
   Tag        Type                         Name/Value
  0x00000004 \(HASH\)                       0x94
- 0x00000005 \(STRTAB\)                     0x134
- 0x00000006 \(SYMTAB\)                     0xc4
- 0x0000000a \(STRSZ\)                      29 \(bytes\)
+ 0x00000005 \(STRTAB\)                     0x120
+ 0x00000006 \(SYMTAB\)                     0xc0
+ 0x0000000a \(STRSZ\)                      25 \(bytes\)
  0x0000000b \(SYMENT\)                     16 \(bytes\)
- 0x00000007 \(RELA\)                       0x154
- 0x00000008 \(RELASZ\)                     12 \(bytes\)
- 0x00000009 \(RELAENT\)                    12 \(bytes\)
- 0x00000016 \(TEXTREL\)                    0x0
  0x00000000 \(NULL\)                       0x0
diff --git a/ld/testsuite/ld-x86-64/ilp32-4.s b/ld/testsuite/ld-x86-64/ilp32-4.s
new file mode 100644
index 0000000..5f270c7
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/ilp32-4.s
@@ -0,0 +1,3 @@
+	.globl _start
+_start:
+	ret
diff --git a/ld/testsuite/ld-x86-64/ilp32-5.d b/ld/testsuite/ld-x86-64/ilp32-5.d
index e4673e5..4870c2b 100644
--- a/ld/testsuite/ld-x86-64/ilp32-5.d
+++ b/ld/testsuite/ld-x86-64/ilp32-5.d
@@ -4,5 +4,5 @@
 
 #...
 [0-9a-f]+ +[0-9a-f]+ +R_X86_64_RELATIVE +[0-9a-f]+
-[0-9a-f]+ +[0-9a-f]+ +R_X86_64_PC32 +[0-9a-f]+ +foo - 4
+[0-9a-f]+ +[0-9a-f]+ +R_X86_64_GLOB_DAT +[0-9a-f]+ +foo \+ 0
 [0-9a-f]+ +[0-9a-f]+ +R_X86_64_32 +[0-9a-f]+ +foo \+ 0
diff --git a/ld/testsuite/ld-x86-64/ilp32-5.s b/ld/testsuite/ld-x86-64/ilp32-5.s
index 0d97807..ef0c60e 100644
--- a/ld/testsuite/ld-x86-64/ilp32-5.s
+++ b/ld/testsuite/ld-x86-64/ilp32-5.s
@@ -1,6 +1,6 @@
 	.globl bar
 bar:
-	mov foo(%rip), %rax
+	mov foo@GOTPCREL(%rip), %rax
 
 	.data
 xxx:
diff --git a/ld/testsuite/ld-x86-64/x86-64.exp b/ld/testsuite/ld-x86-64/x86-64.exp
index e493278..f713ca5 100644
--- a/ld/testsuite/ld-x86-64/x86-64.exp
+++ b/ld/testsuite/ld-x86-64/x86-64.exp
@@ -211,6 +211,7 @@ run_dump_test "ilp32-6"
 run_dump_test "ilp32-7"
 run_dump_test "ilp32-8"
 run_dump_test "ilp32-9"
+run_dump_test "ilp32-10"
 run_dump_test "ia32-1"
 run_dump_test "ia32-2"
 run_dump_test "ia32-3"



More information about the Binutils mailing list