From: H.J. Lu Date: Sun, 2 Aug 2009 23:55:49 +0000 (+0000) Subject: 2009-08-02 H.J. Lu X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=1d85728fd7299ff10bdcc066db96fb7e26748d58;p=binutils-gdb.git 2009-08-02 H.J. Lu Jakub Jelinek PR ld/6443 * elf32-i386.c (elf_i386_tls_transition): Check executable instead of shared for TLS when building PIE. (elf_i386_check_relocs): Likewise. (elf_i386_allocate_dynrelocs): Likewise. (elf_i386_relocate_section): Likewise. * elf64-x86-64.c (elf64_x86_64_tls_transition): Check executable instead of shared for TLS when building PIE. (elf64_x86_64_check_relocs): Likewise. (elf64_x86_64_allocate_dynrelocs): Likewise. (elf64_x86_64_relocate_section): Likewise. ld/testsuite/ 2009-08-02 H.J. Lu PR ld/6443 * ld-i386/i386.exp: Run tlspie1. * ld-x86-64/x86-64.exp: tlspie1. * ld-i386/tlspie1.d: New. * ld-i386/tlspie1.s: Likewise. * ld-x86-64/tlspie1.d: Likewise. * ld-x86-64/tlspie1.s: Likewise. --- diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 2736ccc1cea..51ae9e6e9b6 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,19 @@ +2009-08-02 H.J. Lu + Jakub Jelinek + + PR ld/6443 + * elf32-i386.c (elf_i386_tls_transition): Check executable + instead of shared for TLS when building PIE. + (elf_i386_check_relocs): Likewise. + (elf_i386_allocate_dynrelocs): Likewise. + (elf_i386_relocate_section): Likewise. + + * elf64-x86-64.c (elf64_x86_64_tls_transition): Check executable + instead of shared for TLS when building PIE. + (elf64_x86_64_check_relocs): Likewise. + (elf64_x86_64_allocate_dynrelocs): Likewise. + (elf64_x86_64_relocate_section): Likewise. + 2009-07-31 Anthony Green * config.bfd (targ_cpu): Add moxie-uclinux support. diff --git a/bfd/elf32-i386.c b/bfd/elf32-i386.c index 868e9d4328f..c8e018a6cbd 100644 --- a/bfd/elf32-i386.c +++ b/bfd/elf32-i386.c @@ -1164,7 +1164,7 @@ elf_i386_tls_transition (struct bfd_link_info *info, bfd *abfd, case R_386_TLS_IE_32: case R_386_TLS_IE: case R_386_TLS_GOTIE: - if (!info->shared) + if (info->executable) { if (h == NULL) to_type = R_386_TLS_LE_32; @@ -1180,7 +1180,7 @@ elf_i386_tls_transition (struct bfd_link_info *info, bfd *abfd, { unsigned int new_to_type = to_type; - if (!info->shared + if (info->executable && h != NULL && h->dynindx == -1 && (tls_type & GOT_TLS_IE)) @@ -1206,7 +1206,7 @@ elf_i386_tls_transition (struct bfd_link_info *info, bfd *abfd, break; case R_386_TLS_LDM: - if (!info->shared) + if (info->executable) to_type = R_386_TLS_LE_32; break; @@ -1460,7 +1460,7 @@ elf_i386_check_relocs (bfd *abfd, case R_386_TLS_IE_32: case R_386_TLS_IE: case R_386_TLS_GOTIE: - if (info->shared) + if (!info->executable) info->flags |= DF_STATIC_TLS; /* Fall through */ @@ -1578,7 +1578,7 @@ elf_i386_check_relocs (bfd *abfd, case R_386_TLS_LE_32: case R_386_TLS_LE: - if (!info->shared) + if (info->executable) break; info->flags |= DF_STATIC_TLS; /* Fall through */ @@ -2116,7 +2116,7 @@ elf_i386_allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf) /* If R_386_TLS_{IE_32,IE,GOTIE} symbol is now local to the binary, make it a R_386_TLS_LE_32 requiring no TLS entry. */ if (h->got.refcount > 0 - && !info->shared + && info->executable && h->dynindx == -1 && (elf_i386_hash_entry(h)->tls_type & GOT_TLS_IE)) h->got.offset = (bfd_vma) -1; @@ -3366,7 +3366,7 @@ elf_i386_relocate_section (bfd *output_bfd, break; case R_386_TLS_IE: - if (info->shared) + if (!info->executable) { Elf_Internal_Rela outrel; bfd_byte *loc; @@ -3932,7 +3932,7 @@ elf_i386_relocate_section (bfd *output_bfd, case R_386_TLS_LE_32: case R_386_TLS_LE: - if (info->shared) + if (!info->executable) { Elf_Internal_Rela outrel; asection *sreloc; diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c index 77dedc56ae9..de6f6ecd242 100644 --- a/bfd/elf64-x86-64.c +++ b/bfd/elf64-x86-64.c @@ -950,7 +950,7 @@ elf64_x86_64_tls_transition (struct bfd_link_info *info, bfd *abfd, case R_X86_64_GOTPC32_TLSDESC: case R_X86_64_TLSDESC_CALL: case R_X86_64_GOTTPOFF: - if (!info->shared) + if (info->executable) { if (h == NULL) to_type = R_X86_64_TPOFF32; @@ -965,7 +965,7 @@ elf64_x86_64_tls_transition (struct bfd_link_info *info, bfd *abfd, { unsigned int new_to_type = to_type; - if (!info->shared + if (info->executable && h != NULL && h->dynindx == -1 && tls_type == GOT_TLS_IE) @@ -989,7 +989,7 @@ elf64_x86_64_tls_transition (struct bfd_link_info *info, bfd *abfd, break; case R_X86_64_TLSLD: - if (!info->shared) + if (info->executable) to_type = R_X86_64_TPOFF32; break; @@ -1248,7 +1248,7 @@ elf64_x86_64_check_relocs (bfd *abfd, struct bfd_link_info *info, break; case R_X86_64_GOTTPOFF: - if (info->shared) + if (!info->executable) info->flags |= DF_STATIC_TLS; /* Fall through */ @@ -1942,7 +1942,7 @@ elf64_x86_64_allocate_dynrelocs (struct elf_link_hash_entry *h, void * inf) /* If R_X86_64_GOTTPOFF symbol is now local to the binary, make it a R_X86_64_TPOFF32 requiring no GOT entry. */ if (h->got.refcount > 0 - && !info->shared + && info->executable && h->dynindx == -1 && elf64_x86_64_hash_entry (h)->tls_type == GOT_TLS_IE) { @@ -3632,7 +3632,7 @@ elf64_x86_64_relocate_section (bfd *output_bfd, struct bfd_link_info *info, break; case R_X86_64_DTPOFF32: - if (info->shared || (input_section->flags & SEC_CODE) == 0) + if (!info->executable|| (input_section->flags & SEC_CODE) == 0) relocation -= elf64_x86_64_dtpoff_base (info); else relocation = elf64_x86_64_tpoff (info, relocation); diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog index 525bc8e119d..60ee1ec8dcc 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,3 +1,14 @@ +2009-08-02 H.J. Lu + + PR ld/6443 + * ld-i386/i386.exp: Run tlspie1. + * ld-x86-64/x86-64.exp: tlspie1. + + * ld-i386/tlspie1.d: New. + * ld-i386/tlspie1.s: Likewise. + * ld-x86-64/tlspie1.d: Likewise. + * ld-x86-64/tlspie1.s: Likewise. + 2009-07-31 Hans-Peter Nilsson * ld-mmix/x.s, ld-mmix/y.s, ld-mmix/zeroeh.ld, diff --git a/ld/testsuite/ld-i386/i386.exp b/ld/testsuite/ld-i386/i386.exp index 18e8d808bdd..df2fcfcdbec 100644 --- a/ld/testsuite/ld-i386/i386.exp +++ b/ld/testsuite/ld-i386/i386.exp @@ -139,3 +139,4 @@ run_dump_test "hidden3" run_dump_test "protected1" run_dump_test "protected2" run_dump_test "protected3" +run_dump_test "tlspie1" diff --git a/ld/testsuite/ld-i386/tlspie1.d b/ld/testsuite/ld-i386/tlspie1.d new file mode 100644 index 00000000000..bac5dc67dea --- /dev/null +++ b/ld/testsuite/ld-i386/tlspie1.d @@ -0,0 +1,6 @@ +#name: TLS with PIE +#as: --32 +#ld: -melf_i386 -pie +#readelf: -r + +There are no relocations in this file. diff --git a/ld/testsuite/ld-i386/tlspie1.s b/ld/testsuite/ld-i386/tlspie1.s new file mode 100644 index 00000000000..c2b6151fe7d --- /dev/null +++ b/ld/testsuite/ld-i386/tlspie1.s @@ -0,0 +1,64 @@ + .text + .globl ___tls_get_addr + .type ___tls_get_addr, @function +___tls_get_addr: + ret + .size ___tls_get_addr, .-___tls_get_addr +.globl _start + .type _start, @function +_start: + pushl %ebp + movl %esp, %ebp + pushl %esi + pushl %ebx + call .L3 +.L3: + popl %ebx + addl $_GLOBAL_OFFSET_TABLE_+[.-.L3], %ebx + movl %gs:foo2@NTPOFF, %esi + addl %gs:foo1@NTPOFF, %esi + movl foo3@GOTNTPOFF(%ebx), %eax + addl %gs:(%eax), %esi + leal foo4@TLSGD(,%ebx,1), %eax + call ___tls_get_addr@PLT + addl (%eax), %esi + leal foo5@TLSGD(,%ebx,1), %eax + call ___tls_get_addr@PLT + addl (%eax), %esi + movl %esi, %eax + popl %ebx + popl %esi + leave + ret + .size _start, .-_start +.globl foo1 + .section .tbss,"awT",@nobits + .align 4 + .type foo1, @object + .size foo1, 4 +foo1: + .zero 4 +.globl foo2 + .align 4 + .type foo2, @object + .size foo2, 4 +foo2: + .zero 4 +.globl foo3 + .align 4 + .type foo3, @object + .size foo3, 4 +foo3: + .zero 4 +.globl foo4 + .align 4 + .type foo4, @object + .size foo4, 4 +foo4: + .zero 4 +.globl foo5 + .align 4 + .type foo5, @object + .size foo5, 4 +foo5: + .zero 4 diff --git a/ld/testsuite/ld-x86-64/tlspie1.d b/ld/testsuite/ld-x86-64/tlspie1.d new file mode 100644 index 00000000000..e06e8b1afbb --- /dev/null +++ b/ld/testsuite/ld-x86-64/tlspie1.d @@ -0,0 +1,6 @@ +#name: TLS with PIE +#as: --64 +#ld: -melf_x86_64 -pie +#readelf: -r + +There are no relocations in this file. diff --git a/ld/testsuite/ld-x86-64/tlspie1.s b/ld/testsuite/ld-x86-64/tlspie1.s new file mode 100644 index 00000000000..2e9db663c03 --- /dev/null +++ b/ld/testsuite/ld-x86-64/tlspie1.s @@ -0,0 +1,58 @@ + .text + .globl __tls_get_addr + .type __tls_get_addr, @function +__tls_get_addr: + ret + .size __tls_get_addr, .-__tls_get_addr +.globl _start + .type _start, @function +_start: + movq foo3@GOTTPOFF(%rip), %rax + pushq %rbx + movl %fs:foo2@TPOFF, %ebx + addl %fs:foo1@TPOFF, %ebx + addl %fs:(%rax), %ebx + leaq foo4@TLSLD(%rip), %rdi + call __tls_get_addr@PLT + addl foo4@DTPOFF(%rax), %ebx + .byte 0x66 + leaq foo5@TLSGD(%rip), %rdi + .value 0x6666 + rex64 + call __tls_get_addr@PLT + addl (%rax), %ebx + movl %ebx, %eax + popq %rbx + ret + .size _start, .-_start +.globl foo1 + .section .tbss,"awT",@nobits + .align 4 + .type foo1, @object + .size foo1, 4 +foo1: + .zero 4 +.globl foo2 + .align 4 + .type foo2, @object + .size foo2, 4 +foo2: + .zero 4 +.globl foo3 + .align 4 + .type foo3, @object + .size foo3, 4 +foo3: + .zero 4 +.globl foo4 + .align 4 + .type foo4, @object + .size foo4, 4 +foo4: + .zero 4 +.globl foo5 + .align 4 + .type foo5, @object + .size foo5, 4 +foo5: + .zero 4 diff --git a/ld/testsuite/ld-x86-64/x86-64.exp b/ld/testsuite/ld-x86-64/x86-64.exp index 3d7285d3ee0..c61f0aeaa69 100644 --- a/ld/testsuite/ld-x86-64/x86-64.exp +++ b/ld/testsuite/ld-x86-64/x86-64.exp @@ -96,3 +96,4 @@ run_dump_test "protected2-l1om" run_dump_test "protected3" run_dump_test "protected3-l1om" run_dump_test "tlsle1" +run_dump_test "tlspie1"