Add initial support for TLS sections in PE format files.
authorNick Clifton <nickc@redhat.com>
Mon, 10 Nov 2003 17:04:55 +0000 (17:04 +0000)
committerNick Clifton <nickc@redhat.com>
Mon, 10 Nov 2003 17:04:55 +0000 (17:04 +0000)
bfd/ChangeLog
bfd/peXXigen.c
ld/ChangeLog
ld/scripttempl/pe.sc

index b45ea437928f7b2558877d2153a2bf617a494f49..73cabd8e750689cd047d449081c1273c41326517 100644 (file)
@@ -1,3 +1,9 @@
+2003-11-10  Jonathan Wilson <jonwil@tpgi.com.au>
+
+       * peXXigen.c (_bfd_XXi_swap_aouthdr_out): Swap out tls pointer.
+       (_bfd_XXi_final_link_postscript): Look for __tks_used symbol.  If
+       found initialise the tls data directory entry.
+
 2003-11-07  Alan Modra  <amodra@bigpond.net.au>
 
        * elf32-ppc.c (ppc_elf_install_value): Delete.
index cd0a91c5aac1f777e6f06b339a44452c7ac2be72..f3b3a96d760ec627c60f29c3504466777d367a8d 100644 (file)
@@ -570,8 +570,7 @@ _bfd_XXi_swap_aouthdr_out (abfd, in, out)
   struct internal_extra_pe_aouthdr *extra = &pe->pe_opthdr;
   PEAOUTHDR *aouthdr_out = (PEAOUTHDR *) out;
   bfd_vma sa, fa, ib;
-  IMAGE_DATA_DIRECTORY idata2, idata5;
-
+  IMAGE_DATA_DIRECTORY idata2, idata5, tls;
   
   if (pe->force_minimum_alignment)
     {
@@ -590,6 +589,7 @@ _bfd_XXi_swap_aouthdr_out (abfd, in, out)
 
   idata2 = pe->pe_opthdr.DataDirectory[1];
   idata5 = pe->pe_opthdr.DataDirectory[12];
+  tls = pe->pe_opthdr.DataDirectory[9];
   
   if (aouthdr_in->tsize)
     {
@@ -641,6 +641,7 @@ _bfd_XXi_swap_aouthdr_out (abfd, in, out)
      a final link is going to be performed, it can overwrite them.  */
   extra->DataDirectory[1]  = idata2;
   extra->DataDirectory[12] = idata5;
+  extra->DataDirectory[9] = tls;
 
   if (extra->DataDirectory[1].VirtualAddress == 0)
     /* Until other .idata fixes are made (pending patch), the entry for
@@ -2025,7 +2026,19 @@ _bfd_XXi_final_link_postscript (abfd, pfinfo)
          + h1->root.u.def.section->output_offset)
         - pe_data (abfd)->pe_opthdr.DataDirectory[12].VirtualAddress);      
     }
-  
+
+  h1 = coff_link_hash_lookup (coff_hash_table (info),
+                             "__tls_used", FALSE, FALSE, TRUE);
+  if (h1 != NULL)
+    {
+      pe_data (abfd)->pe_opthdr.DataDirectory[9].VirtualAddress =
+       (h1->root.u.def.value
+        + h1->root.u.def.section->output_section->vma
+        + h1->root.u.def.section->output_offset
+        - pe_data (abfd)->pe_opthdr.ImageBase);
+      pe_data (abfd)->pe_opthdr.DataDirectory[9].Size = 0x18;
+    }
+
   /* If we couldn't find idata$2, we either have an excessively
      trivial program or are in DEEP trouble; we have to assume trivial
      program....  */
index edcd312fc7ad3bf70e403200065cdc0522a76f37..d0d747f0397aee9364f2468fb7a1269763ebb572 100644 (file)
@@ -1,3 +1,7 @@
+2003-11-10  Jonathan Wilson <jonwil@tpgi.com.au>
+
+       * scripttempl/pe.sc: Add support for TLS sections.
+
 2003-11-09  Alan Modra  <amodra@bigpond.net.au>
 
        * configure.host (HOSTING_LIBS): Group libgcc and libc with
index 2fd27f93d263c977ada1522ec62fd82fadaa013a..da09eb430481d7dbe00a51c7d5e52d5591dfc5a6 100644 (file)
@@ -25,6 +25,10 @@ if test "${RELOCATING}"; then
     SORT(*)(.idata$6)
     SORT(*)(.idata$7)'
   R_CRT='*(SORT(.CRT$*))'
+  R_TLS='
+    *(.tls)
+    *(.tls$)
+    *(SORT(.tls$*))'
   R_RSRC='*(SORT(.rsrc$*))'
 else
   R_TEXT=
@@ -129,6 +133,11 @@ SECTIONS
     ${R_CRT}
   }
 
+  .tls ${RELOCATING+BLOCK(__section_alignment__)} :
+  {                                    
+    ${R_TLS}
+  }
+
   .endjunk ${RELOCATING+BLOCK(__section_alignment__)} :
   {
     /* end is deprecated, don't use it */