From: H.J. Lu Date: Fri, 8 Apr 2011 16:14:49 +0000 (+0000) Subject: Properly handle R_386_TLS_LDO_32 for PIE. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=959b0961c9c714aa735ebb59e925fdf6f5117d99;p=binutils-gdb.git Properly handle R_386_TLS_LDO_32 for PIE. bfd/ 2011-04-08 H.J. Lu PR ld/12654 * elf32-i386.c (elf_i386_relocate_section): Check !executable instead of shared for R_386_TLS_LDO_32. ld/testsuite/ 2011-04-08 H.J. Lu PR ld/12654 * ld-i386/i386.exp: Run tlspie2. * ld-i386/tlspie2.d: New. * ld-i386/tlspie2.s: Likewise. --- diff --git a/bfd/ChangeLog b/bfd/ChangeLog index ebc5e183da6..7d6534030c0 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,9 @@ +2011-04-08 H.J. Lu + + 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 * Makefile.am (SOURCE_HFILES): Remove xcoff-target.h diff --git a/bfd/elf32-i386.c b/bfd/elf32-i386.c index 693c8e89d2e..1b76cb4a454 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 7c81bcb711b..f6081e1bda8 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2011-04-08 H.J. Lu + + PR ld/12654 + * ld-i386/i386.exp: Run tlspie2. + + * ld-i386/tlspie2.d: New. + * ld-i386/tlspie2.s: Likewise. + 2011-04-06 Joseph Myers * 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 ead0df16679..cc82e151332 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 00000000000..16d6ae48c98 --- /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 00000000000..a5864301c7d --- /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