This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

PATCH: PR ld/12654: R_386_TLS_LDO_32 relocations aren't handled properly with -pie


Hi,

I checked in this patch to properly handle R_386_TLS_LDO_32 for PIE.

H.J.
---
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index ebc5e18..7d65340 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,9 @@
+2011-04-08  H.J. Lu  <hongjiu.lu@intel.com>
+
+	PR ld/12654
+	* elf32-i386.c (elf_i386_relocate_section): Check !executable
+	instead of shared for R_386_TLS_LDO_32.
+
 2011-04-08  Tristan Gingold  <gingold@adacore.com>
 
 	* Makefile.am (SOURCE_HFILES): Remove xcoff-target.h
diff --git a/bfd/elf32-i386.c b/bfd/elf32-i386.c
index 693c8e8..1b76cb4 100644
--- a/bfd/elf32-i386.c
+++ b/bfd/elf32-i386.c
@@ -4025,7 +4025,7 @@ elf_i386_relocate_section (bfd *output_bfd,
 	  break;
 
 	case R_386_TLS_LDO_32:
-	  if (info->shared || (input_section->flags & SEC_CODE) == 0)
+	  if (!info->executable || (input_section->flags & SEC_CODE) == 0)
 	    relocation -= elf_i386_dtpoff_base (info);
 	  else
 	    /* When converting LDO to LE, we must negate.  */
diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog
index 7c81bcb..f6081e1 100644
--- a/ld/testsuite/ChangeLog
+++ b/ld/testsuite/ChangeLog
@@ -1,3 +1,11 @@
+2011-04-08  H.J. Lu  <hongjiu.lu@intel.com>
+
+	PR ld/12654
+	* ld-i386/i386.exp: Run tlspie2.
+
+	* ld-i386/tlspie2.d: New.
+	* ld-i386/tlspie2.s: Likewise.
+
 2011-04-06  Joseph Myers  <joseph@codesourcery.com>
 
 	* ld-selective/selective.exp (xscale-*-*): Don't handle.
diff --git a/ld/testsuite/ld-i386/i386.exp b/ld/testsuite/ld-i386/i386.exp
index ead0df1..cc82e15 100644
--- a/ld/testsuite/ld-i386/i386.exp
+++ b/ld/testsuite/ld-i386/i386.exp
@@ -190,6 +190,7 @@ run_dump_test "protected1"
 run_dump_test "protected2"
 run_dump_test "protected3"
 run_dump_test "tlspie1"
+run_dump_test "tlspie2"
 run_dump_test "nogot1"
 run_dump_test "nogot2"
 run_dump_test "discarded1"
diff --git a/ld/testsuite/ld-i386/tlspie2.d b/ld/testsuite/ld-i386/tlspie2.d
new file mode 100644
index 0000000..16d6ae4
--- /dev/null
+++ b/ld/testsuite/ld-i386/tlspie2.d
@@ -0,0 +1,13 @@
+#name: TLS with PIE
+#as: --32
+#ld: -melf_i386 -pie
+#objdump: -dw
+
+.*: +file format .*
+
+
+Disassembly of section .text:
+
+0+188 <_start>:
+[ 	]*[a-f0-9]+:	8d 05 fc ff ff ff    	lea    0xfffffffc,%eax
+#pass
diff --git a/ld/testsuite/ld-i386/tlspie2.s b/ld/testsuite/ld-i386/tlspie2.s
new file mode 100644
index 0000000..a586430
--- /dev/null
+++ b/ld/testsuite/ld-i386/tlspie2.s
@@ -0,0 +1,12 @@
+	.section	.tbss,"awT",@nobits
+	.align 4
+	.type	a, @object
+	.size	a, 4
+a:
+	.zero	4
+	.text
+.globl _start
+	.type	_start, @function
+_start:
+	leal	a@dtpoff, %eax
+	.size	_start, .-_start


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]