OSDN Git Service

bfd/ChangeLog:
authorAlexandre Oliva <aoliva@redhat.com>
Mon, 28 Jul 2008 18:07:04 +0000 (18:07 +0000)
committerAlexandre Oliva <aoliva@redhat.com>
Mon, 28 Jul 2008 18:07:04 +0000 (18:07 +0000)
* elf32-i386.c (struct elf_i386_link_hash_table): Added field
tls_module_base.
(elf_i386_link_hash_table_create): Initialize it.
(elf_i386_always_size_sections): Set it.
(set_tls_module_base): New.
(elf_i386_relocate_sections): Call it.
* elf64-x86-64.c (struct elf64_x86_64_link_hash_table): Added
field tls_module_base.
(elf64_x86_64_link_hash_table_create): Initialize it.
(elf64_x86_64_always_size_sections): Set it.
(set_tls_module_base): New.
(elf64_x86_64_relocate_sections): Call it.
Reported by Cary Coutant <ccoutant@google.com>
ld/testsuite/ChangeLog:
* ld-i386/tlsbindesc.dd: Adjust incorrect expectations for LD to
LE relaxation.
* ld-x86-64/tlsbindesc.dd: Likewise.
* ld-i386/tlsbindesc.rd: Adjust address of _TLS_MODULE_BASE_.
* ld-x86-64/tlsbindesc.rd: Likewise.
Reported by Cary Coutant <ccoutant@google.com>

bfd/ChangeLog
bfd/elf32-i386.c
bfd/elf64-x86-64.c
ld/testsuite/ChangeLog
ld/testsuite/ld-i386/tlsbindesc.dd [new file with mode: 0644]
ld/testsuite/ld-i386/tlsbindesc.rd [new file with mode: 0644]
ld/testsuite/ld-x86-64/tlsbindesc.dd [new file with mode: 0644]
ld/testsuite/ld-x86-64/tlsbindesc.rd [new file with mode: 0644]

index 8626b26..8eae490 100644 (file)
@@ -1,3 +1,19 @@
+2008-07-28  Alexandre Oliva  <aoliva@redhat.com>
+
+       * elf32-i386.c (struct elf_i386_link_hash_table): Added field
+       tls_module_base.
+       (elf_i386_link_hash_table_create): Initialize it.
+       (elf_i386_always_size_sections): Set it.
+       (set_tls_module_base): New.
+       (elf_i386_relocate_sections): Call it.
+       * elf64-x86-64.c (struct elf64_x86_64_link_hash_table): Added
+       field tls_module_base.
+       (elf64_x86_64_link_hash_table_create): Initialize it.
+       (elf64_x86_64_always_size_sections): Set it.
+       (set_tls_module_base): New.
+       (elf64_x86_64_relocate_sections): Call it.
+       Reported by Cary Coutant <ccoutant@google.com>
+
 2008-07-28  Ineiev  <ineiev@yahoo.co.uk>
 
        * elf32-arm.c (arm_map_one_stub): Declare variables at beginning
index 578f595..9e96e21 100644 (file)
@@ -692,6 +692,9 @@ struct elf_i386_link_hash_table
 
   /* Small local sym to section mapping cache.  */
   struct sym_sec_cache sym_sec;
+
+  /* _TLS_MODULE_BASE_ symbol.  */
+  struct bfd_link_hash_entry *tls_module_base;
 };
 
 /* Get the i386 ELF linker hash table from a link_info structure.  */
@@ -767,6 +770,7 @@ elf_i386_link_hash_table_create (bfd *abfd)
   ret->is_vxworks = 0;
   ret->srelplt2 = NULL;
   ret->plt0_pad_byte = 0;
+  ret->tls_module_base = NULL;
 
   return &ret->elf.root;
 }
@@ -2431,6 +2435,9 @@ elf_i386_always_size_sections (bfd *output_bfd,
                 tls_sec, 0, NULL, FALSE,
                 bed->collect, &bh)))
            return FALSE;
+
+         elf_i386_hash_table (info)->tls_module_base = bh;
+
          tlsbase = (struct elf_link_hash_entry *)bh;
          tlsbase->def_regular = 1;
          tlsbase->other = STV_HIDDEN;
@@ -2475,6 +2482,27 @@ elf_i386_fake_sections (bfd *abfd ATTRIBUTE_UNUSED,
   return TRUE;
 }
 
+/* _TLS_MODULE_BASE_ needs to be treated especially when linking
+   executables.  Rather than setting it to the beginning of the TLS
+   section, we have to set it to the end.    This function may be called
+   multiple times, it is idempotent.  */
+
+static void
+set_tls_module_base (struct bfd_link_info *info)
+{
+  struct bfd_link_hash_entry *base;
+
+  if (!info->executable)
+    return;
+
+  base = elf_i386_hash_table (info)->tls_module_base;
+
+  if (!base)
+    return;
+
+  base->u.def.value = elf_hash_table (info)->tls_size;
+}
+
 /* Return the base VMA address which should be subtracted from real addresses
    when resolving @dtpoff relocation.
    This is PT_TLS segment p_vaddr.  */
@@ -2536,6 +2564,8 @@ elf_i386_relocate_section (bfd *output_bfd,
                    && !strcmp (input_section->output_section->name,
                                ".tls_vars"));
 
+  set_tls_module_base (info);
+
   rel = relocs;
   relend = relocs + input_section->reloc_count;
   for (; rel < relend; rel++)
index 71c10a7..bc8c652 100644 (file)
@@ -503,6 +503,9 @@ struct elf64_x86_64_link_hash_table
 
   /* Small local sym to section mapping cache.  */
   struct sym_sec_cache sym_sec;
+
+  /* _TLS_MODULE_BASE_ symbol.  */
+  struct bfd_link_hash_entry *tls_module_base;
 };
 
 /* Get the x86-64 ELF linker hash table from a link_info structure.  */
@@ -575,6 +578,7 @@ elf64_x86_64_link_hash_table_create (bfd *abfd)
   ret->tlsdesc_got = 0;
   ret->tls_ld_got.refcount = 0;
   ret->sgotplt_jump_table_size = 0;
+  ret->tls_module_base = NULL;
 
   return &ret->elf.root;
 }
@@ -2239,6 +2243,9 @@ elf64_x86_64_always_size_sections (bfd *output_bfd,
                 tls_sec, 0, NULL, FALSE,
                 bed->collect, &bh)))
            return FALSE;
+
+         elf64_x86_64_hash_table (info)->tls_module_base = bh;
+
          tlsbase = (struct elf_link_hash_entry *)bh;
          tlsbase->def_regular = 1;
          tlsbase->other = STV_HIDDEN;
@@ -2249,6 +2256,27 @@ elf64_x86_64_always_size_sections (bfd *output_bfd,
   return TRUE;
 }
 
+/* _TLS_MODULE_BASE_ needs to be treated especially when linking
+   executables.  Rather than setting it to the beginning of the TLS
+   section, we have to set it to the end.  This function may be called
+   multiple times, it is idempotent.  */
+
+static void
+set_tls_module_base (struct bfd_link_info *info)
+{
+  struct bfd_link_hash_entry *base;
+
+  if (!info->executable)
+    return;
+
+  base = elf64_x86_64_hash_table (info)->tls_module_base;
+
+  if (!base)
+    return;
+
+  base->u.def.value = elf_hash_table (info)->tls_size;
+}
+
 /* Return the base VMA address which should be subtracted from real addresses
    when resolving @dtpoff relocation.
    This is PT_TLS segment p_vaddr.  */
@@ -2319,6 +2347,8 @@ elf64_x86_64_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
   local_got_offsets = elf_local_got_offsets (input_bfd);
   local_tlsdesc_gotents = elf64_x86_64_local_tlsdesc_gotent (input_bfd);
 
+  set_tls_module_base (info);
+
   rel = relocs;
   relend = relocs + input_section->reloc_count;
   for (; rel < relend; rel++)
index d7c6724..6d881ca 100644 (file)
@@ -1,3 +1,12 @@
+2008-07-28  Alexandre Oliva  <aoliva@redhat.com>
+
+       * ld-i386/tlsbindesc.dd: Adjust incorrect expectations for LD to
+       LE relaxation.
+       * ld-x86-64/tlsbindesc.dd: Likewise.
+       * ld-i386/tlsbindesc.rd: Adjust address of _TLS_MODULE_BASE_.
+       * ld-x86-64/tlsbindesc.rd: Likewise.
+       Reported by Cary Coutant <ccoutant@google.com>
+
 2008-07-27  Alan Modra  <amodra@bigpond.net.au>
 
        * ld-gc/gc.exp (test_gc): xfail powerpc64.
diff --git a/ld/testsuite/ld-i386/tlsbindesc.dd b/ld/testsuite/ld-i386/tlsbindesc.dd
new file mode 100644 (file)
index 0000000..f77d1c8
--- /dev/null
@@ -0,0 +1,456 @@
+#source: tlsbindesc.s
+#source: tlsbin.s
+#as: --32
+#ld: -melf_i386 tmpdir/libtlslib.so
+#objdump: -drj.text
+#target: i?86-*-*
+
+# PT_TLS layout is:
+# Offset from  Offset from     Name
+# TCB base     TCB end
+# 0x00         -0xa0           sg1..sg8
+# 0x20         -0x80           sl1..sl8
+# 0x40         -0x60           sh1..sh8
+# 0x60         -0x40           bg1..bg8
+# 0x80         -0x20           bl1..bl8
+
+.*: +file format elf32-i386
+
+Disassembly of section .text:
+
+[0-9a-f]+ <fn2>:
+ [0-9a-f]+:    55[     ]+push   %ebp
+ [0-9a-f]+:    89 e5[  ]+mov    %esp,%ebp
+ [0-9a-f]+:    53[     ]+push   %ebx
+ [0-9a-f]+:    50[     ]+push   %eax
+ [0-9a-f]+:    e8 00 00 00 00[         ]+call   [0-9a-f]+ <fn2\+0xa>
+ [0-9a-f]+:    5b[     ]+pop    %ebx
+ [0-9a-f]+:    81 c3 fa 10 00 00[      ]+add    \$0x10fa,%ebx
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+#  GD -> IE because variable is not defined in executable
+ [0-9a-f]+:    8b 83 f8 ff ff ff[      ]+mov    -0x8\(%ebx\),%eax
+#                              ->R_386_TLS_TPOFF32     sG1
+ [0-9a-f]+:    f7 d8[  ]+neg    %eax
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+#  GD -> IE because variable is not defined in executable where
+#  the variable is referenced through @gottpoff too
+ [0-9a-f]+:    8b 83 e8 ff ff ff[      ]+mov    -0x18\(%ebx\),%eax
+#                              ->R_386_TLS_TPOFF32     sG2
+ [0-9a-f]+:    f7 d8[  ]+neg    %eax
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+#  GD -> IE because variable is not defined in executable where
+#  the variable is referenced through @gotntpoff too
+ [0-9a-f]+:    8b 83 dc ff ff ff[      ]+mov    -0x24\(%ebx\),%eax
+#                              ->R_386_TLS_TPOFF       sG3
+ [0-9a-f]+:    66 90[  ]+xchg   %ax,%ax
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+#  GD -> IE because variable is not defined in executable where
+#  the variable is referenced through @gottpoff and @gotntpoff too
+ [0-9a-f]+:    8b 83 f0 ff ff ff[      ]+mov    -0x10\(%ebx\),%eax
+#                              ->R_386_TLS_TPOFF32     sG4
+ [0-9a-f]+:    66 90[  ]+xchg   %ax,%ax
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+#  GD -> LE with global variable defined in executable
+ [0-9a-f]+:    8d 05 00 f0 ff ff[      ]+lea    0xfffff000,%eax
+#                                                      sg1
+ [0-9a-f]+:    66 90[  ]+xchg   %ax,%ax
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+#  GD -> LE with local variable defined in executable
+ [0-9a-f]+:    8d 05 20 f0 ff ff[      ]+lea    0xfffff020,%eax
+#                                                      sl1
+ [0-9a-f]+:    66 90[  ]+xchg   %ax,%ax
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+#  GD -> LE with hidden variable defined in executable
+ [0-9a-f]+:    8d 05 40 f0 ff ff[      ]+lea    0xfffff040,%eax
+#                                                      sh1
+ [0-9a-f]+:    66 90[  ]+xchg   %ax,%ax
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+#  LD -> LE
+ [0-9a-f]+:    8d 05 00 00 00 00[      ]+lea    0x0,%eax
+ [0-9a-f]+:    66 90[  ]+xchg   %ax,%ax
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    8d 90 20 f0 ff ff[      ]+lea    -0xfe0\(%eax\),%edx
+#                                                      sl1
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    8d 88 24 f0 ff ff[      ]+lea    -0xfdc\(%eax\),%ecx
+#                                                      sl2
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+#  LD -> LE against hidden variables
+ [0-9a-f]+:    8d 05 00 00 00 00[      ]+lea    0x0,%eax
+ [0-9a-f]+:    66 90[  ]+xchg   %ax,%ax
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    8d 90 40 f0 ff ff[      ]+lea    -0xfc0\(%eax\),%edx
+#                                                      sh1
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    8d 88 44 f0 ff ff[      ]+lea    -0xfbc\(%eax\),%ecx
+#                                                      sh2
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+#  @gottpoff IE against global var
+ [0-9a-f]+:    65 8b 0d 00 00 00 00[   ]+mov    %gs:0x0,%ecx
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    2b 8b e8 ff ff ff[      ]+sub    -0x18\(%ebx\),%ecx
+#                              ->R_386_TLS_TPOFF32     sG2
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+#  @gottpoff IE against global var
+ [0-9a-f]+:    65 a1 00 00 00 00[      ]+mov    %gs:0x0,%eax
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    2b 83 ec ff ff ff[      ]+sub    -0x14\(%ebx\),%eax
+#                              ->R_386_TLS_TPOFF32     sG4
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+#  @gotntpoff IE against global var
+ [0-9a-f]+:    65 8b 0d 00 00 00 00[   ]+mov    %gs:0x0,%ecx
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    03 8b dc ff ff ff[      ]+add    -0x24\(%ebx\),%ecx
+#                              ->R_386_TLS_TPOFF       sG3
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+#  @gotntpoff IE against global var
+ [0-9a-f]+:    65 a1 00 00 00 00[      ]+mov    %gs:0x0,%eax
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    03 83 f0 ff ff ff[      ]+add    -0x10\(%ebx\),%eax
+#                              ->R_386_TLS_TPOFF       sG4
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+#  @gottpoff IE -> LE against global var defined in exec
+ [0-9a-f]+:    65 8b 0d 00 00 00 00[   ]+mov    %gs:0x0,%ecx
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    81 e9 00 10 00 00[      ]+sub    \$0x1000,%ecx
+#                                                      sg1
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+#  @gotntpoff IE -> LE against local var
+ [0-9a-f]+:    65 8b 0d 00 00 00 00[   ]+mov    %gs:0x0,%ecx
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    81 c0 20 f0 ff ff[      ]+add    \$0xfffff020,%eax
+#                                                      sl1
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+#  @gottpoff IE -> LE against hidden var
+ [0-9a-f]+:    65 8b 0d 00 00 00 00[   ]+mov    %gs:0x0,%ecx
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    81 e9 c0 0f 00 00[      ]+sub    \$0xfc0,%ecx
+#                                                      sh1
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+#  Direct access through %gs
+#  @gotntpoff IE against global var
+ [0-9a-f]+:    8b 8b e0 ff ff ff[      ]+mov    -0x20\(%ebx\),%ecx
+#                              ->R_386_TLS_TPOFF       sG5
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    65 8b 11[       ]+mov    %gs:\(%ecx\),%edx
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+#  @gotntpoff IE->LE against local var
+ [0-9a-f]+:    c7 c0 30 f0 ff ff[      ]+mov    \$0xfffff030,%eax
+#                                                      sl5
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    65 8b 10[       ]+mov    %gs:\(%eax\),%edx
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+#  @gotntpoff IE->LE against hidden var
+ [0-9a-f]+:    c7 c2 50 f0 ff ff[      ]+mov    \$0xfffff050,%edx
+#                                                      sh5
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    65 8b 12[       ]+mov    %gs:\(%edx\),%edx
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    8b 5d fc[       ]+mov    -0x4\(%ebp\),%ebx
+ [0-9a-f]+:    c9[     ]+leave *
+ [0-9a-f]+:    c3[     ]+ret *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+
+[0-9a-f]+ <_start>:
+ [0-9a-f]+:    55[     ]+push   %ebp
+ [0-9a-f]+:    89 e5[  ]+mov    %esp,%ebp
+ [0-9a-f]+:    e8 00 00 00 00[         ]+call   [0-9a-f]+ <_start\+0x8>
+ [0-9a-f]+:    59[     ]+pop    %ecx
+ [0-9a-f]+:    81 c1 a4 0f 00 00[      ]+add    \$0xfa4,%ecx
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+#  @gottpoff IE against global var
+ [0-9a-f]+:    65 8b 15 00 00 00 00[   ]+mov    %gs:0x0,%edx
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    2b 91 f4 ff ff ff[      ]+sub    -0xc\(%ecx\),%edx
+#                              ->R_386_TLS_TPOFF32     sG6
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+#  @indntpoff IE against global var
+ [0-9a-f]+:    65 a1 00 00 00 00[      ]+mov    %gs:0x0,%eax
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    03 05 e8 a0 04 08[      ]+add    0x804a0e8,%eax
+#                              ->R_386_TLS_TPOFF       sG7
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+#  @indntpoff direct %gs access IE against global var
+ [0-9a-f]+:    8b 15 00 a1 04 08[      ]+mov    0x804a100,%edx
+#                              ->R_386_TLS_TPOFF       sG8
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    65 8b 02[       ]+mov    %gs:\(%edx\),%eax
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+#  @gottpoff IE -> LE against global var defined in exec
+ [0-9a-f]+:    65 8b 15 00 00 00 00[   ]+mov    %gs:0x0,%edx
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    81 ea 8c 0f 00 00[      ]+sub    \$0xf8c,%edx
+#                                                      bg6
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+#  @indntpoff IE -> LE against global var defined in exec
+ [0-9a-f]+:    65 a1 00 00 00 00[      ]+mov    %gs:0x0,%eax
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    81 c0 78 f0 ff ff[      ]+add    \$0xfffff078,%eax
+#                                                      bg7
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+#  @indntpoff direct %gs access IE -> LE against global var defined
+#  in exec
+ [0-9a-f]+:    c7 c2 7c f0 ff ff[      ]+mov    \$0xfffff07c,%edx
+#                                                      bg8
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    65 8b 02[       ]+mov    %gs:\(%edx\),%eax
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+#  @gottpoff IE -> LE against local var
+ [0-9a-f]+:    65 8b 15 00 00 00 00[   ]+mov    %gs:0x0,%edx
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    81 ea 6c 0f 00 00[      ]+sub    \$0xf6c,%edx
+#                                                      bl6
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+#  @indntpoff IE -> LE against local var
+ [0-9a-f]+:    65 a1 00 00 00 00[      ]+mov    %gs:0x0,%eax
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    81 c0 98 f0 ff ff[      ]+add    \$0xfffff098,%eax
+#                                                      bl7
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+#  @indntpoff direct %gs access IE -> LE against local var
+ [0-9a-f]+:    c7 c2 9c f0 ff ff[      ]+mov    \$0xfffff09c,%edx
+#                                                      bl8
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    65 8b 02[       ]+mov    %gs:\(%edx\),%eax
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+#  @gottpoff IE -> LE against hidden but not local var
+ [0-9a-f]+:    65 8b 15 00 00 00 00[   ]+mov    %gs:0x0,%edx
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    81 ea ac 0f 00 00[      ]+sub    \$0xfac,%edx
+#                                                      sh6
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+#  @indntpoff IE -> LE against hidden but not local var
+ [0-9a-f]+:    65 a1 00 00 00 00[      ]+mov    %gs:0x0,%eax
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    81 c0 58 f0 ff ff[      ]+add    \$0xfffff058,%eax
+#                                                      sh7
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+#  @indntpoff direct %gs access IE -> LE against hidden but not
+#  local var
+ [0-9a-f]+:    c7 c2 5c f0 ff ff[      ]+mov    \$0xfffff05c,%edx
+#                                                      sh8
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    65 8b 02[       ]+mov    %gs:\(%edx\),%eax
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+#  LE @tpoff, global var defined in exec
+ [0-9a-f]+:    ba 00 10 00 00[         ]+mov    \$0x1000,%edx
+#                                                      sg1
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    65 a1 00 00 00 00[      ]+mov    %gs:0x0,%eax
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    29 d0[  ]+sub    %edx,%eax
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+#  LE @tpoff, local var
+ [0-9a-f]+:    b8 7f 0f 00 00[         ]+mov    \$0xf7f,%eax
+#                                                      bl1+1
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    65 8b 15 00 00 00 00[   ]+mov    %gs:0x0,%edx
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    29 c2[  ]+sub    %eax,%edx
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+#  LE @tpoff, hidden var defined in exec
+ [0-9a-f]+:    b8 bd 0f 00 00[         ]+mov    \$0xfbd,%eax
+#                                                      sh1+3
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    65 8b 15 00 00 00 00[   ]+mov    %gs:0x0,%edx
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    29 c2[  ]+sub    %eax,%edx
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+#  LE @ntpoff, global var defined in exec
+ [0-9a-f]+:    65 a1 00 00 00 00[      ]+mov    %gs:0x0,%eax
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    8d 90 04 f0 ff ff[      ]+lea    -0xffc\(%eax\),%edx
+#                                                      sg2
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+#  LE @ntpoff, local var, non-canonical sequence
+ [0-9a-f]+:    b8 86 f0 ff ff[         ]+mov    \$0xfffff086,%eax
+#                                                      bl2+2
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    65 8b 15 00 00 00 00[   ]+mov    %gs:0x0,%edx
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    01 c2[  ]+add    %eax,%edx
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+#  LE @ntpoff, hidden var defined in exec, non-canonical sequence
+ [0-9a-f]+:    65 8b 15 00 00 00 00[   ]+mov    %gs:0x0,%edx
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    81 c2 45 f0 ff ff[      ]+add    \$0xfffff045,%edx
+#                                                      sh2+1
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+#  LE @ntpoff, global var defined in exec
+ [0-9a-f]+:    65 a1 08 f0 ff ff[      ]+mov    %gs:0xfffff008,%eax
+#                                                      sg3
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+#  LE @ntpoff, local var
+ [0-9a-f]+:    65 8b 15 8b f0 ff ff[   ]+mov    %gs:0xfffff08b,%edx
+#                                                      bl3+3
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+#  LE @ntpoff, hidden var defined in exec
+ [0-9a-f]+:    65 8b 15 49 f0 ff ff[   ]+mov    %gs:0xfffff049,%edx
+#                                                      sh3+1
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    90[     ]+nop *
+ [0-9a-f]+:    8b 5d fc[       ]+mov    -0x4\(%ebp\),%ebx
+ [0-9a-f]+:    c9[     ]+leave *
+ [0-9a-f]+:    c3[     ]+ret *
diff --git a/ld/testsuite/ld-i386/tlsbindesc.rd b/ld/testsuite/ld-i386/tlsbindesc.rd
new file mode 100644 (file)
index 0000000..dd3e65e
--- /dev/null
@@ -0,0 +1,151 @@
+#source: tlsbindesc.s
+#source: tlsbin.s
+#as: --32
+#ld: -melf_i386 tmpdir/libtlslib.so
+#readelf: -Ssrl
+#target: i?86-*-*
+
+There are [0-9]+ section headers, starting at offset 0x[0-9a-f]+:
+
+Section Headers:
+  \[Nr\] Name +Type +Addr +Off +Size +ES Flg Lk Inf Al
+ +\[[ 0-9]+\] +NULL +0+ 0+ 0+ 0+ +0 +0 +0
+ +\[[ 0-9]+\] \.interp +.*
+ +\[[ 0-9]+\] \.hash +.*
+ +\[[ 0-9]+\] \.dynsym +.*
+ +\[[ 0-9]+\] \.dynstr +.*
+ +\[[ 0-9]+\] \.rel.dyn +.*
+ +\[[ 0-9]+\] \.text +PROGBITS +0+8049000 .*
+ +\[[ 0-9]+\] \.tdata +PROGBITS +0+804a000 [0-9a-f]+ 000060 00 WAT  0   0 4096
+ +\[[ 0-9]+\] \.tbss +NOBITS +[0-9a-f]+ [0-9a-f]+ 000040 00 WAT  0   0  1
+ +\[[ 0-9]+\] \.dynamic +DYNAMIC +0+804a060 .*
+ +\[[ 0-9]+\] \.got +PROGBITS +0+804a0e0 .*
+ +\[[ 0-9]+\] \.got\.plt +PROGBITS +0+804a104 .*
+ +\[[ 0-9]+\] \.shstrtab +.*
+ +\[[ 0-9]+\] \.symtab +.*
+ +\[[ 0-9]+\] \.strtab +.*
+Key to Flags:
+.*
+.*
+.*
+
+Elf file type is EXEC \(Executable file\)
+Entry point 0x8049158
+There are [0-9]+ program headers, starting at offset [0-9]+
+
+Program Headers:
+  Type +Offset +VirtAddr +PhysAddr +FileSiz +MemSiz +Flg Align
+  PHDR.*
+  INTERP.*
+.*Requesting program interpreter.*
+  LOAD.*
+  LOAD.*
+  DYNAMIC.*
+  TLS +0x[0-9a-f]+ 0x[0-9a-f]+ 0x[0-9a-f]+ 0x0+60 0x0+a0 R +0x1000
+
+ Section to Segment mapping:
+  Segment Sections...
+   00 +
+   01 +.interp *
+   02 +.interp .hash .dynsym .dynstr .rel.dyn .text *
+   03 +.tdata .dynamic .got .got.plt *
+   04 +.dynamic *
+   05 +.tdata .tbss *
+
+Relocation section '.rel.dyn' at offset 0x[0-9a-f]+ contains 9 entries:
+ Offset +Info +Type +Sym.Value +Sym. Name
+0+804a0e0  0000010e R_386_TLS_TPOFF +0+ +sG3
+0+804a0e4  0000020e R_386_TLS_TPOFF +0+ +sG5
+0+804a0e8  0000030e R_386_TLS_TPOFF +0+ +sG7
+0+804a0ec  00000425 R_386_TLS_TPOFF32 0+ +sG2
+0+804a0f0  00000525 R_386_TLS_TPOFF32 0+ +sG4
+0+804a0f4  0000050e R_386_TLS_TPOFF +0+ +sG4
+0+804a0f8  00000725 R_386_TLS_TPOFF32 0+ +sG6
+0+804a0fc  00000825 R_386_TLS_TPOFF32 0+ +sG1
+0+804a100  00000b0e R_386_TLS_TPOFF +0+ +sG8
+
+Symbol table '\.dynsym' contains [0-9]+ entries:
+ +Num: +Value  Size Type +Bind +Vis +Ndx Name
+ +[0-9]+: 0+ +0 NOTYPE  LOCAL  DEFAULT  UND *
+ +[0-9]+: 0+ +0 TLS +GLOBAL DEFAULT  UND sG3
+ +[0-9]+: 0+ +0 TLS +GLOBAL DEFAULT  UND sG5
+ +[0-9]+: 0+ +0 TLS +GLOBAL DEFAULT  UND sG7
+ +[0-9]+: 0+ +0 TLS +GLOBAL DEFAULT  UND sG2
+ +[0-9]+: 0+ +0 TLS +GLOBAL DEFAULT  UND sG4
+ +[0-9]+: [0-9a-f]+ +0 NOTYPE  GLOBAL DEFAULT  ABS __bss_start
+ +[0-9]+: 0+ +0 TLS +GLOBAL DEFAULT  UND sG6
+ +[0-9]+: 0+ +0 TLS +GLOBAL DEFAULT  UND sG1
+ +[0-9]+: [0-9a-f]+ +0 NOTYPE  GLOBAL DEFAULT  ABS _edata
+ +[0-9]+: [0-9a-f]+ +0 NOTYPE  GLOBAL DEFAULT  ABS _end
+ +[0-9]+: 0+ +0 TLS +GLOBAL DEFAULT  UND sG8
+
+Symbol table '\.symtab' contains [0-9]+ entries:
+ +Num: +Value  Size Type +Bind +Vis +Ndx Name
+ +[0-9]+: 0+ +0 NOTYPE  LOCAL  DEFAULT  UND *
+ +[0-9]+: [0-9a-f]+ +0 SECTION LOCAL  DEFAULT +1 *
+ +[0-9]+: [0-9a-f]+ +0 SECTION LOCAL  DEFAULT +2 *
+ +[0-9]+: [0-9a-f]+ +0 SECTION LOCAL  DEFAULT +3 *
+ +[0-9]+: [0-9a-f]+ +0 SECTION LOCAL  DEFAULT +4 *
+ +[0-9]+: [0-9a-f]+ +0 SECTION LOCAL  DEFAULT +5 *
+ +[0-9]+: [0-9a-f]+ +0 SECTION LOCAL  DEFAULT +6 *
+ +[0-9]+: [0-9a-f]+ +0 SECTION LOCAL  DEFAULT +7 *
+ +[0-9]+: [0-9a-f]+ +0 SECTION LOCAL  DEFAULT +8 *
+ +[0-9]+: [0-9a-f]+ +0 SECTION LOCAL  DEFAULT +9 *
+ +[0-9]+: [0-9a-f]+ +0 SECTION LOCAL  DEFAULT +10 *
+ +[0-9]+: [0-9a-f]+ +0 SECTION LOCAL  DEFAULT +11 *
+ +[0-9]+: 00000020 +0 TLS +LOCAL  DEFAULT +7 sl1
+ +[0-9]+: 00000024 +0 TLS +LOCAL  DEFAULT +7 sl2
+ +[0-9]+: 00000028 +0 TLS +LOCAL  DEFAULT +7 sl3
+ +[0-9]+: 0000002c +0 TLS +LOCAL  DEFAULT +7 sl4
+ +[0-9]+: 00000030 +0 TLS +LOCAL  DEFAULT +7 sl5
+ +[0-9]+: 00000034 +0 TLS +LOCAL  DEFAULT +7 sl6
+ +[0-9]+: 00000038 +0 TLS +LOCAL  DEFAULT +7 sl7
+ +[0-9]+: 0000003c +0 TLS +LOCAL  DEFAULT +7 sl8
+ +[0-9]+: 00000080 +0 TLS +LOCAL  DEFAULT +8 bl1
+ +[0-9]+: 00000084 +0 TLS +LOCAL  DEFAULT +8 bl2
+ +[0-9]+: 00000088 +0 TLS +LOCAL  DEFAULT +8 bl3
+ +[0-9]+: 0000008c +0 TLS +LOCAL  DEFAULT +8 bl4
+ +[0-9]+: 00000090 +0 TLS +LOCAL  DEFAULT +8 bl5
+ +[0-9]+: 00000094 +0 TLS +LOCAL  DEFAULT +8 bl6
+ +[0-9]+: 00000098 +0 TLS +LOCAL  DEFAULT +8 bl7
+ +[0-9]+: 0000009c +0 TLS +LOCAL  DEFAULT +8 bl8
+ +[0-9]+: 00001000 +0 TLS +LOCAL  HIDDEN +7 _TLS_MODULE_BASE_
+ +[0-9]+: 0+804a060 +0 OBJECT  LOCAL  HIDDEN    9 _DYNAMIC
+ +[0-9]+: [0-9a-f]+ +0 OBJECT  LOCAL  HIDDEN   11 _GLOBAL_OFFSET_TABLE_
+ +[0-9]+: 0+ +0 TLS +GLOBAL DEFAULT  UND sG3
+ +[0-9]+: 0000001c +0 TLS +GLOBAL DEFAULT +7 sg8
+ +[0-9]+: 0000007c +0 TLS +GLOBAL DEFAULT +8 bg8
+ +[0-9]+: 00000074 +0 TLS +GLOBAL DEFAULT +8 bg6
+ +[0-9]+: 0+ +0 TLS +GLOBAL DEFAULT  UND sG5
+ +[0-9]+: 00000068 +0 TLS +GLOBAL DEFAULT +8 bg3
+ +[0-9]+: 00000008 +0 TLS +GLOBAL DEFAULT +7 sg3
+ +[0-9]+: 0+ +0 TLS +GLOBAL DEFAULT  UND sG7
+ +[0-9]+: 00000048 +0 TLS +GLOBAL HIDDEN +7 sh3
+ +[0-9]+: 0+ +0 TLS +GLOBAL DEFAULT  UND sG2
+ +[0-9]+: 0000000c +0 TLS +GLOBAL DEFAULT +7 sg4
+ +[0-9]+: 0+ +0 TLS +GLOBAL DEFAULT  UND sG4
+ +[0-9]+: 00000010 +0 TLS +GLOBAL DEFAULT +7 sg5
+ +[0-9]+: 00000070 +0 TLS +GLOBAL DEFAULT +8 bg5
+ +[0-9]+: 00000058 +0 TLS +GLOBAL HIDDEN +7 sh7
+ +[0-9]+: 0000005c +0 TLS +GLOBAL HIDDEN +7 sh8
+ +[0-9]+: 0+ +0 TLS +GLOBAL DEFAULT +7 sg1
+ +[0-9]+: 0+8049158 +0 FUNC +GLOBAL DEFAULT +6 _start
+ +[0-9]+: 0000004c +0 TLS +GLOBAL HIDDEN +7 sh4
+ +[0-9]+: 00000078 +0 TLS +GLOBAL DEFAULT +8 bg7
+ +[0-9]+: 00000050 +0 TLS +GLOBAL HIDDEN +7 sh5
+ +[0-9]+: [0-9a-f]+ +0 NOTYPE  GLOBAL DEFAULT  ABS __bss_start
+ +[0-9]+: 0+ +0 TLS +GLOBAL DEFAULT  UND sG6
+ +[0-9]+: 0+8049000 +0 FUNC +GLOBAL DEFAULT +6 fn2
+ +[0-9]+: 00000004 +0 TLS +GLOBAL DEFAULT +7 sg2
+ +[0-9]+: 0+ +0 TLS +GLOBAL DEFAULT  UND sG1
+ +[0-9]+: 00000040 +0 TLS +GLOBAL HIDDEN +7 sh1
+ +[0-9]+: 00000014 +0 TLS +GLOBAL DEFAULT +7 sg6
+ +[0-9]+: 00000018 +0 TLS +GLOBAL DEFAULT +7 sg7
+ +[0-9]+: [0-9a-f]+ +0 NOTYPE  GLOBAL DEFAULT  ABS _edata
+ +[0-9]+: [0-9a-f]+ +0 NOTYPE  GLOBAL DEFAULT  ABS _end
+ +[0-9]+: 00000044 +0 TLS +GLOBAL HIDDEN +7 sh2
+ +[0-9]+: 00000054 +0 TLS +GLOBAL HIDDEN +7 sh6
+ +[0-9]+: 0+ +0 TLS +GLOBAL DEFAULT  UND sG8
+ +[0-9]+: 00000064 +0 TLS +GLOBAL DEFAULT +8 bg2
+ +[0-9]+: 00000060 +0 TLS +GLOBAL DEFAULT +8 bg1
+ +[0-9]+: 0000006c +0 TLS +GLOBAL DEFAULT +8 bg4
diff --git a/ld/testsuite/ld-x86-64/tlsbindesc.dd b/ld/testsuite/ld-x86-64/tlsbindesc.dd
new file mode 100644 (file)
index 0000000..9e82eab
--- /dev/null
@@ -0,0 +1,301 @@
+#source: tlsbindesc.s
+#source: tlsbin.s
+#as: --64
+#ld: -shared -melf_x86_64
+#objdump: -drj.text
+#target: x86_64-*-*
+
+# PT_TLS layout is:
+# Offset from   Offset from     Name
+# TCB base      TCB end
+# 0x00          -0xa0           sg1..sg8
+# 0x20          -0x80           sl1..sl8
+# 0x40          -0x60           sh1..sh8
+# 0x60          -0x40           bg1..bg8
+# 0x80          -0x20           bl1..bl8
+
+.*: +file format elf64-x86-64
+
+Disassembly of section .text:
+
+0+401000 <fn2>:
+  [0-9a-f]+:   55[     ]+push   %rbp
+  [0-9a-f]+:   48 89 e5[       ]+mov    %rsp,%rbp
+#  GD -> IE because variable is not defined in executable
+  [0-9a-f]+:   48 8b 05 65 03 20 00[   ]+mov    0x200365\(%rip\),%rax +# 601370 <.*>
+#                              -> R_X86_64_TPOFF64     sG1
+  [0-9a-f]+:   66 90[  ]+xchg   %ax,%ax
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+#  GD -> IE because variable is not defined in executable where
+#  the variable is referenced through IE too
+  [0-9a-f]+:   48 8b 05 48 03 20 00[   ]+mov    0x200348\(%rip\),%rax +# 601360 <.*>
+#                              -> R_X86_64_TPOFF64     sG2
+  [0-9a-f]+:   66 90[  ]+xchg   %ax,%ax
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+#  GD -> LE with global variable defined in executable
+  [0-9a-f]+:   48 c7 c0 60 ff ff ff[   ]+mov    \$0xf+60,%rax
+#                                                      sg1
+  [0-9a-f]+:   66 90[  ]+xchg   %ax,%ax
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+#  GD -> LE with local variable defined in executable
+  [0-9a-f]+:   48 c7 c0 80 ff ff ff[   ]+mov    \$0xf+80,%rax
+#                                                      sl1
+  [0-9a-f]+:   66 90[  ]+xchg   %ax,%ax
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+#  GD -> LE with hidden variable defined in executable
+  [0-9a-f]+:   48 c7 c0 a0 ff ff ff[   ]+mov    \$0xf+a0,%rax
+#                                                      sh1
+  [0-9a-f]+:   66 90[  ]+xchg   %ax,%ax
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+#  LD -> LE
+  [0-9a-f]+:   48 c7 c0 00 00 00 00[   ]+mov    \$0x0,%rax
+  [0-9a-f]+:   66 90[  ]+xchg   %ax,%ax
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   48 8d 90 81 ff ff ff[   ]+lea    -0x7f\(%rax\),%rdx
+#                                                      sl1+1
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   4c 8d 88 86 ff ff ff[   ]+lea    -0x7a\(%rax\),%r9
+#                                                      sl2+2
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+#  LD -> LE against hidden variables
+  [0-9a-f]+:   48 8d 90 a0 ff ff ff[   ]+lea    -0x60\(%rax\),%rdx
+#                                                      sh1
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   48 8d 88 a7 ff ff ff[   ]+lea    -0x59\(%rax\),%rcx
+#                                                      sh2+3
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+#  IE against global var
+  [0-9a-f]+:   64 4c 8b 0c 25 00 00[   ]+mov    %fs:0x0,%r9
+  [0-9a-f]+:   00 00 *
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   4c 03 0d d6 02 20 00[   ]+add    0x2002d6\(%rip\),%r9 +# 601360 <.*>
+#                              -> R_X86_64_TPOFF64     sG2
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+#  IE -> LE against global var defined in exec
+  [0-9a-f]+:   64 4c 8b 14 25 00 00[   ]+mov    %fs:0x0,%r10
+  [0-9a-f]+:   00 00 *
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   4d 8d 92 60 ff ff ff[   ]+lea    -0xa0\(%r10\),%r10
+#                                                      sg1
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+#  IE -> LE against local var
+  [0-9a-f]+:   64 48 8b 04 25 00 00[   ]+mov    %fs:0x0,%rax
+  [0-9a-f]+:   00 00 *
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   48 8d 80 80 ff ff ff[   ]+lea    -0x80\(%rax\),%rax
+#                                                      sl1
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+#  IE -> LE against hidden var
+  [0-9a-f]+:   64 48 8b 0c 25 00 00[   ]+mov    %fs:0x0,%rcx
+  [0-9a-f]+:   00 00 *
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   48 8d 89 a0 ff ff ff[   ]+lea    -0x60\(%rcx\),%rcx
+#                                                      sh1
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+#  Direct access through %fs
+#  IE against global var
+  [0-9a-f]+:   48 8b 0d 81 02 20 00[   ]+mov    0x200281\(%rip\),%rcx +# 601358 <.*>
+#                              -> R_X86_64_TPOFF64     sG5
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   64 48 8b 11[    ]+mov    %fs:\(%rcx\),%rdx
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+#  IE->LE against local var
+  [0-9a-f]+:   49 c7 c3 90 ff ff ff[   ]+mov    \$0xf+90,%r11
+#                                                      sl5
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   64 4d 8b 23[    ]+mov    %fs:\(%r11\),%r12
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+#  IE->LE against hidden var
+  [0-9a-f]+:   48 c7 c2 b0 ff ff ff[   ]+mov    \$0xf+b0,%rdx
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   64 48 8b 12[    ]+mov    %fs:\(%rdx\),%rdx
+#                                                      sh5
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   c9[     ]+leaveq *
+  [0-9a-f]+:   c3[     ]+retq *
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+
+[0-9a-f]+ <_start>:
+  [0-9a-f]+:   55[     ]+push   %rbp
+  [0-9a-f]+:   48 89 e5[       ]+mov    %rsp,%rbp
+#  IE against global var
+  [0-9a-f]+:   64 4c 8b 1c 25 00 00[   ]+mov    %fs:0x0,%r11
+  [0-9a-f]+:   00 00 *
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   4c 03 1d 4a 02 20 00[   ]+add    0x20024a\(%rip\),%r11 +# 601368 <.*>
+#                              -> R_X86_64_TPOFF64     sG6
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+#  IE -> LE against global var defined in exec
+  [0-9a-f]+:   64 48 8b 14 25 00 00[   ]+mov    %fs:0x0,%rdx
+  [0-9a-f]+:   00 00 *
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   48 8d 92 d4 ff ff ff[   ]+lea    -0x2c\(%rdx\),%rdx
+#                                                      bg6
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+#  IE -> LE against local var
+  [0-9a-f]+:   64 4c 8b 24 25 00 00[   ]+mov    %fs:0x0,%r12
+  [0-9a-f]+:   00 00 *
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   49 81 c4 f4 ff ff ff[   ]+add    \$0xf+f4,%r12
+#                                                      bl6
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+#  direct %fs access IE -> LE against local var
+  [0-9a-f]+:   48 c7 c2 fc ff ff ff[   ]+mov    \$0xf+fc,%rdx
+#                                                      bl8
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   64 48 8b 02[    ]+mov    %fs:\(%rdx\),%rax
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+#  IE -> LE against hidden but not local var
+  [0-9a-f]+:   64 48 8b 14 25 00 00[   ]+mov    %fs:0x0,%rdx
+  [0-9a-f]+:   00 00 *
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   48 8d 92 b4 ff ff ff[   ]+lea    -0x4c\(%rdx\),%rdx
+#                                                      sh6
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+#  direct %fs access IE -> LE against hidden but not local var
+  [0-9a-f]+:   48 c7 c2 bc ff ff ff[   ]+mov    \$0xf+bc,%rdx
+#                                                      sh8
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   64 48 8b 02[    ]+mov    %fs:\(%rdx\),%rax
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+#  LE, global var defined in exec
+  [0-9a-f]+:   64 48 8b 04 25 00 00[   ]+mov    %fs:0x0,%rax
+  [0-9a-f]+:   00 00 *
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   48 8d 90 64 ff ff ff[   ]+lea    -0x9c\(%rax\),%rdx
+#                                                      sg2
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+#  LE, local var, non-canonical sequence
+  [0-9a-f]+:   49 c7 c1 e6 ff ff ff[   ]+mov    \$0xf+e6,%r9
+#                                                      bl2+2
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   64 48 8b 14 25 00 00[   ]+mov    %fs:0x0,%rdx
+  [0-9a-f]+:   00 00 *
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   4c 01 ca[       ]+add    %r9,%rdx
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+#  LE, hidden var defined in exec, non-canonical sequence
+  [0-9a-f]+:   64 48 8b 14 25 00 00[   ]+mov    %fs:0x0,%rdx
+  [0-9a-f]+:   00 00 *
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   48 81 c2 a5 ff ff ff[   ]+add    \$0xf+a5,%rdx
+#                                                      sh2+1
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+#  Direct %fs access
+#  LE, global var defined in exec
+  [0-9a-f]+:   64 48 8b 04 25 68 ff[   ]+mov    %fs:0xf+68,%rax
+  [0-9a-f]+:   ff ff *
+#                                                      sg3
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+#  LE, local var
+  [0-9a-f]+:   64 4c 8b 14 25 eb ff[   ]+mov    %fs:0xf+eb,%r10
+  [0-9a-f]+:   ff ff *
+#                                                      bl3+3
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+#  LE, hidden var defined in exec
+  [0-9a-f]+:   64 48 8b 14 25 a9 ff[   ]+mov    %fs:0xf+a9,%rdx
+  [0-9a-f]+:   ff ff *
+#                                                      sh3+1
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   90[     ]+nop *
+  [0-9a-f]+:   c9[     ]+leaveq *
+  [0-9a-f]+:   c3[     ]+retq *
diff --git a/ld/testsuite/ld-x86-64/tlsbindesc.rd b/ld/testsuite/ld-x86-64/tlsbindesc.rd
new file mode 100644 (file)
index 0000000..b70d78f
--- /dev/null
@@ -0,0 +1,138 @@
+#source: tlsbindesc.s
+#source: tlsbin.s
+#as: --64
+#ld: -shared -melf_x86_64
+#readelf: -WSsrl
+#target: x86_64-*-*
+
+There are [0-9]+ section headers, starting at offset 0x[0-9a-f]+:
+
+Section Headers:
+  \[Nr\] Name +Type +Address +Off +Size +ES Flg Lk Inf Al
+ +\[[ 0-9]+\] +NULL +0+ 0+ 0+ 00 +0 +0 +0
+ +\[[ 0-9]+\] .interp +.*
+ +\[[ 0-9]+\] .hash +.*
+ +\[[ 0-9]+\] .dynsym +.*
+ +\[[ 0-9]+\] .dynstr +.*
+ +\[[ 0-9]+\] .rela.dyn +.*
+ +\[[ 0-9]+\] .text +PROGBITS +0+401000 0+1000 0+1f6 00 +AX +0 +0 +4096
+ +\[[ 0-9]+\] .tdata +PROGBITS +0+6011f6 0+11f6 0+60 00 WAT +0 +0 +1
+ +\[[ 0-9]+\] .tbss +NOBITS +0+601256 0+1256 0+40 00 WAT +0 +0 +1
+ +\[[ 0-9]+\] .dynamic +DYNAMIC +0+601258 0+1258 0+100 10 +WA +4 +0 +8
+ +\[[ 0-9]+\] .got +PROGBITS +0+601358 0+1358 0+20 08 +WA +0 +0 +8
+ +\[[ 0-9]+\] .got.plt +PROGBITS +0+601378 0+1378 0+18 08 +WA +0 +0 +8
+ +\[[ 0-9]+\] .shstrtab +.*
+ +\[[ 0-9]+\] .symtab +.*
+ +\[[ 0-9]+\] .strtab +.*
+Key to Flags:
+.*
+.*
+.*
+
+Elf file type is EXEC \(Executable file\)
+Entry point 0x401108
+There are [0-9]+ program headers, starting at offset [0-9]+
+
+Program Headers:
+  Type +Offset +VirtAddr +PhysAddr +FileSiz +MemSiz +Flg Align
+  PHDR.*
+  INTERP.*
+.*Requesting program interpreter.*
+  LOAD +0x0+ 0x0+400000 0x0+400000 0x0+11f6 0x0+11f6 R E 0x200000
+  LOAD +0x0+11f6 0x0+6011f6 0x0+6011f6 0x0+19a 0x0+19a RW  0x200000
+  DYNAMIC +0x0+1258 0x0+601258 0x0+601258 0x0+100 0x0+100 RW  0x8
+  TLS +0x0+11f6 0x0+6011f6 0x0+6011f6 0x0+60 0x0+a0 R +0x1
+
+ Section to Segment mapping:
+  Segment Sections...
+   00 *
+   01 +.interp *
+   02 +.interp .hash .dynsym .dynstr .rela.dyn .text *
+   03 +.tdata .dynamic .got .got.plt *
+   04 +.dynamic *
+   05 +.tdata .tbss *
+
+Relocation section '.rela.dyn' at offset 0x[0-9a-f]+ contains 4 entries:
+ +Offset +Info +Type +Symbol's Value  Symbol's Name \+ Addend
+0+601358  0+100000012 R_X86_64_TPOFF64 +0+ sG5 \+ 0
+0+601360  0+200000012 R_X86_64_TPOFF64 +0+ sG2 \+ 0
+0+601368  0+400000012 R_X86_64_TPOFF64 +0+ sG6 \+ 0
+0+601370  0+500000012 R_X86_64_TPOFF64 +0+ sG1 \+ 0
+
+Symbol table '\.dynsym' contains [0-9]+ entries:
+ +Num: +Value +Size Type +Bind +Vis +Ndx Name
+ +[0-9]+: 0+ +0 NOTYPE  LOCAL  DEFAULT  UND *
+ +[0-9]+: 0+ +0 TLS +GLOBAL DEFAULT  UND sG5
+ +[0-9]+: 0+ +0 TLS +GLOBAL DEFAULT  UND sG2
+ +[0-9]+: 0+[0-9a-f]+ +0 NOTYPE  GLOBAL DEFAULT  ABS __bss_start
+ +[0-9]+: 0+ +0 TLS +GLOBAL DEFAULT  UND sG6
+ +[0-9]+: 0+ +0 TLS +GLOBAL DEFAULT  UND sG1
+ +[0-9]+: 0+[0-9a-f]+ +0 NOTYPE  GLOBAL DEFAULT  ABS _edata
+ +[0-9]+: 0+[0-9a-f]+ +0 NOTYPE  GLOBAL DEFAULT  ABS _end
+
+Symbol table '\.symtab' contains [0-9]+ entries:
+ +Num: +Value +Size Type +Bind +Vis +Ndx Name
+ +[0-9]+: 0+ +0 NOTYPE  LOCAL  DEFAULT  UND *
+ +[0-9]+: [0-9a-f]+ +0 SECTION LOCAL  DEFAULT +1 *
+ +[0-9]+: [0-9a-f]+ +0 SECTION LOCAL  DEFAULT +2 *
+ +[0-9]+: [0-9a-f]+ +0 SECTION LOCAL  DEFAULT +3 *
+ +[0-9]+: [0-9a-f]+ +0 SECTION LOCAL  DEFAULT +4 *
+ +[0-9]+: [0-9a-f]+ +0 SECTION LOCAL  DEFAULT +5 *
+ +[0-9]+: [0-9a-f]+ +0 SECTION LOCAL  DEFAULT +6 *
+ +[0-9]+: [0-9a-f]+ +0 SECTION LOCAL  DEFAULT +7 *
+ +[0-9]+: [0-9a-f]+ +0 SECTION LOCAL  DEFAULT +8 *
+ +[0-9]+: [0-9a-f]+ +0 SECTION LOCAL  DEFAULT +9 *
+ +[0-9]+: [0-9a-f]+ +0 SECTION LOCAL  DEFAULT +10 *
+ +[0-9]+: [0-9a-f]+ +0 SECTION LOCAL  DEFAULT +11 *
+ +[0-9]+: 0+20 +0 TLS +LOCAL  DEFAULT +7 sl1
+ +[0-9]+: 0+24 +0 TLS +LOCAL  DEFAULT +7 sl2
+ +[0-9]+: 0+28 +0 TLS +LOCAL  DEFAULT +7 sl3
+ +[0-9]+: 0+2c +0 TLS +LOCAL  DEFAULT +7 sl4
+ +[0-9]+: 0+30 +0 TLS +LOCAL  DEFAULT +7 sl5
+ +[0-9]+: 0+34 +0 TLS +LOCAL  DEFAULT +7 sl6
+ +[0-9]+: 0+38 +0 TLS +LOCAL  DEFAULT +7 sl7
+ +[0-9]+: 0+3c +0 TLS +LOCAL  DEFAULT +7 sl8
+ +[0-9]+: 0+80 +0 TLS +LOCAL  DEFAULT +8 bl1
+ +[0-9]+: 0+84 +0 TLS +LOCAL  DEFAULT +8 bl2
+ +[0-9]+: 0+88 +0 TLS +LOCAL  DEFAULT +8 bl3
+ +[0-9]+: 0+8c +0 TLS +LOCAL  DEFAULT +8 bl4
+ +[0-9]+: 0+90 +0 TLS +LOCAL  DEFAULT +8 bl5
+ +[0-9]+: 0+94 +0 TLS +LOCAL  DEFAULT +8 bl6
+ +[0-9]+: 0+98 +0 TLS +LOCAL  DEFAULT +8 bl7
+ +[0-9]+: 0+9c +0 TLS +LOCAL  DEFAULT +8 bl8
+ +[0-9]+: 0+a0 +0 TLS +LOCAL  HIDDEN +7 _TLS_MODULE_BASE_
+ +[0-9]+: 0+601258 +0 OBJECT  LOCAL  HIDDEN    9 _DYNAMIC
+ +[0-9]+: 0+601378 +0 OBJECT  LOCAL  HIDDEN   11 _GLOBAL_OFFSET_TABLE_
+ +[0-9]+: 0+1c +0 TLS +GLOBAL DEFAULT +7 sg8
+ +[0-9]+: 0+7c +0 TLS +GLOBAL DEFAULT +8 bg8
+ +[0-9]+: 0+74 +0 TLS +GLOBAL DEFAULT +8 bg6
+ +[0-9]+: 0+ +0 TLS +GLOBAL DEFAULT  UND sG5
+ +[0-9]+: 0+68 +0 TLS +GLOBAL DEFAULT +8 bg3
+ +[0-9]+: 0+8 +0 TLS +GLOBAL DEFAULT +7 sg3
+ +[0-9]+: 0+48 +0 TLS +GLOBAL HIDDEN +7 sh3
+ +[0-9]+: 0+ +0 TLS +GLOBAL DEFAULT  UND sG2
+ +[0-9]+: 0+c +0 TLS +GLOBAL DEFAULT +7 sg4
+ +[0-9]+: 0+10 +0 TLS +GLOBAL DEFAULT +7 sg5
+ +[0-9]+: 0+70 +0 TLS +GLOBAL DEFAULT +8 bg5
+ +[0-9]+: 0+58 +0 TLS +GLOBAL HIDDEN +7 sh7
+ +[0-9]+: 0+5c +0 TLS +GLOBAL HIDDEN +7 sh8
+ +[0-9]+: 0+ +0 TLS +GLOBAL DEFAULT +7 sg1
+ +[0-9]+: 0+401108 +0 FUNC +GLOBAL DEFAULT +6 _start
+ +[0-9]+: 0+4c +0 TLS +GLOBAL HIDDEN +7 sh4
+ +[0-9]+: 0+78 +0 TLS +GLOBAL DEFAULT +8 bg7
+ +[0-9]+: 0+50 +0 TLS +GLOBAL HIDDEN +7 sh5
+ +[0-9]+: [0-9a-f]+ +0 NOTYPE  GLOBAL DEFAULT  ABS __bss_start
+ +[0-9]+: 0+ +0 TLS +GLOBAL DEFAULT  UND sG6
+ +[0-9]+: 0+401000 +0 FUNC +GLOBAL DEFAULT +6 fn2
+ +[0-9]+: 0+4 +0 TLS +GLOBAL DEFAULT +7 sg2
+ +[0-9]+: 0+ +0 TLS +GLOBAL DEFAULT  UND sG1
+ +[0-9]+: 0+40 +0 TLS +GLOBAL HIDDEN +7 sh1
+ +[0-9]+: 0+14 +0 TLS +GLOBAL DEFAULT +7 sg6
+ +[0-9]+: 0+18 +0 TLS +GLOBAL DEFAULT +7 sg7
+ +[0-9]+: [0-9a-f]+ +0 NOTYPE  GLOBAL DEFAULT  ABS _edata
+ +[0-9]+: [0-9a-f]+ +0 NOTYPE  GLOBAL DEFAULT  ABS _end
+ +[0-9]+: 0+44 +0 TLS +GLOBAL HIDDEN +7 sh2
+ +[0-9]+: 0+54 +0 TLS +GLOBAL HIDDEN +7 sh6
+ +[0-9]+: 0+64 +0 TLS +GLOBAL DEFAULT +8 bg2
+ +[0-9]+: 0+60 +0 TLS +GLOBAL DEFAULT +8 bg1
+ +[0-9]+: 0+6c +0 TLS +GLOBAL DEFAULT +8 bg4