aboutsummaryrefslogtreecommitdiff
path: root/bfd
diff options
context:
space:
mode:
authorNick Clifton <nickc@redhat.com>2003-11-10 17:04:55 +0000
committerNick Clifton <nickc@redhat.com>2003-11-10 17:04:55 +0000
commitca6dee30a352a58b5764e3c299e93d34f9e08bad (patch)
tree45e6dd6f323bd1c70970ecad802d36fddc612c63 /bfd
parent100bcc3f4efba15caf81be6f8da4d0b6309a3334 (diff)
downloadfsf-binutils-gdb-ca6dee30a352a58b5764e3c299e93d34f9e08bad.zip
fsf-binutils-gdb-ca6dee30a352a58b5764e3c299e93d34f9e08bad.tar.gz
fsf-binutils-gdb-ca6dee30a352a58b5764e3c299e93d34f9e08bad.tar.bz2
Add initial support for TLS sections in PE format files.
Diffstat (limited to 'bfd')
-rw-r--r--bfd/ChangeLog6
-rw-r--r--bfd/peXXigen.c19
2 files changed, 22 insertions, 3 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index b45ea43..73cabd8 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -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.
diff --git a/bfd/peXXigen.c b/bfd/peXXigen.c
index cd0a91c..f3b3a96 100644
--- a/bfd/peXXigen.c
+++ b/bfd/peXXigen.c
@@ -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.... */