2009-08-02 H.J. Lu <hongjiu.lu@intel.com>
authorH.J. Lu <hjl.tools@gmail.com>
Sun, 2 Aug 2009 23:55:49 +0000 (23:55 +0000)
committerH.J. Lu <hjl.tools@gmail.com>
Sun, 2 Aug 2009 23:55:49 +0000 (23:55 +0000)
    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.

bfd/ChangeLog
bfd/elf32-i386.c
bfd/elf64-x86-64.c
ld/testsuite/ChangeLog
ld/testsuite/ld-i386/i386.exp
ld/testsuite/ld-i386/tlspie1.d [new file with mode: 0644]
ld/testsuite/ld-i386/tlspie1.s [new file with mode: 0644]
ld/testsuite/ld-x86-64/tlspie1.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/tlspie1.s [new file with mode: 0644]
ld/testsuite/ld-x86-64/x86-64.exp

index 2736ccc1cea392f06b78d1739438a9a980c7e2c4..51ae9e6e9b6de5e0abc31502ff4c720e0b6b0caf 100644 (file)
@@ -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.
index 868e9d4328f3018adb03b7988dba6cde8bc9e646..c8e018a6cbdb4b70a36590ed339902f2dfa6d8d9 100644 (file)
@@ -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;
index 77dedc56ae99da48ee318a09e8b8c5e6b1ae8de7..de6f6ecd242a2735dda536e73698b8e51e85bde5 100644 (file)
@@ -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);
index 525bc8e119d4d54beccef7bf0c8d5d4b9728d77a..60ee1ec8dccb962c0a4c42c62c114e5cedb0d35c 100644 (file)
@@ -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,
index 18e8d808bddf9948768ad784a741467e6e7bab25..df2fcfcdbec9cb22276107af32f6f83b45d92d9c 100644 (file)
@@ -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 (file)
index 0000000..bac5dc6
--- /dev/null
@@ -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 (file)
index 0000000..c2b6151
--- /dev/null
@@ -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 (file)
index 0000000..e06e8b1
--- /dev/null
@@ -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 (file)
index 0000000..2e9db66
--- /dev/null
@@ -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
index 3d7285d3ee06cd7d09c6ceba7671eba7d4e4d642..c61f0aeaa69d029029e2ae0e331b6bca7d3090cc 100644 (file)
@@ -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"