2009-08-02 H.J. Lu <hongjiu.lu@intel.com>
Jakub Jelinek <jakub@redhat.com> 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 <hongjiu.lu@intel.com> 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.
This commit is contained in:
parent
249da68570
commit
1d85728fd7
@ -1,3 +1,19 @@
|
||||
2009-08-02 H.J. Lu <hongjiu.lu@intel.com>
|
||||
Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
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 <green@moxielogic.com>
|
||||
|
||||
* config.bfd (targ_cpu): Add moxie-uclinux support.
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -1,3 +1,14 @@
|
||||
2009-08-02 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
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 <hp@bitrange.com>
|
||||
|
||||
* ld-mmix/x.s, ld-mmix/y.s, ld-mmix/zeroeh.ld,
|
||||
|
@ -139,3 +139,4 @@ run_dump_test "hidden3"
|
||||
run_dump_test "protected1"
|
||||
run_dump_test "protected2"
|
||||
run_dump_test "protected3"
|
||||
run_dump_test "tlspie1"
|
||||
|
6
ld/testsuite/ld-i386/tlspie1.d
Normal file
6
ld/testsuite/ld-i386/tlspie1.d
Normal file
@ -0,0 +1,6 @@
|
||||
#name: TLS with PIE
|
||||
#as: --32
|
||||
#ld: -melf_i386 -pie
|
||||
#readelf: -r
|
||||
|
||||
There are no relocations in this file.
|
64
ld/testsuite/ld-i386/tlspie1.s
Normal file
64
ld/testsuite/ld-i386/tlspie1.s
Normal file
@ -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
|
6
ld/testsuite/ld-x86-64/tlspie1.d
Normal file
6
ld/testsuite/ld-x86-64/tlspie1.d
Normal file
@ -0,0 +1,6 @@
|
||||
#name: TLS with PIE
|
||||
#as: --64
|
||||
#ld: -melf_x86_64 -pie
|
||||
#readelf: -r
|
||||
|
||||
There are no relocations in this file.
|
58
ld/testsuite/ld-x86-64/tlspie1.s
Normal file
58
ld/testsuite/ld-x86-64/tlspie1.s
Normal file
@ -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
|
@ -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"
|
||||
|
Loading…
x
Reference in New Issue
Block a user