[patch bfd]: Fix generation of .tls directory entry

Kai Tietz ktietz70@googlemail.com
Tue Dec 21 15:13:00 GMT 2010


2010/12/21 Kai Tietz <ktietz70@googlemail.com>:
> 2010/12/21 Dave Korn <dave.korn.cygwin@gmail.com>:
>> On 21/12/2010 11:03, Kai Tietz wrote:
>>> 2010/12/21 Kai Tietz <ktietz70@googlemail.com>:
>>
>>>> I found the issue.
>>
>>  Thanks for persisting.
>>
>>>> The cause for this is that bfd searches for
>>>> '__tls_used', which is the underscored version of '_tls_used'
>>>> variable. Caused by the fact that x64 windows doesn't prefix symbols
>>>> by underscore, the symbol wasn't found, as it remains '_tls_used'.
>>>>
>>>> So we have two chances here to solve this: a) Change for windows x64
>>>> the symbol to '__tls_used', or b) search in bfd for x64 windows for
>>>> '_tls_used' instead of '_tls_used'.
>>
>>  We should do whatever MSVC does when targeting 64-bit windows, shouldn't we?
>>
>>> This patch should fix this underscoring issue (should affect wince arm too).
>>
>>  This is clearly a much better solution! :)
>>
>>>         * peXXigen.c (_bfd_XXi_final_link_postscript): Use
>>>         TARGET_UNDERSCORE to determine "_tls_used" name.
>>>         (TARGET_UNDERSCORE): Define to default zero, if not present.
>>>
>>>         * ld-pe/pe.exp: Add TLS directory test.
>>>         * ld-pe/tlssec.s: New.
>>>         * ld-pe/tlssec64.d: New.
>>>         * ld-pe/tlssec32.d: New.
>>>
>>> Tested for x86_64-w64-mingw32, i686-pc-mingw32, and i686-pc-cygwin. Ok
>>> for apply?
>>
>>  OK with one change: please move the TARGET_UNDERSCORE default definition up
>> to the top of the file, underneath the header includes, where there are
>> already some other macro definitions getting adjusted.  (I think it's cleaner
>> not to have supposedly global symbols suddenly entering scope half way through
>> a file...)
>>
>>  Also, please do verify that the MS 64-bit compiler does the same thing.  (It
>> seems very highly likely that it does, which is why I'm OK for the patch to go
>> in first and you to adjust it afterwards if necessary.)
>>
>>    cheers,
>>      DaveK
>>
>>
>
> Ok, I remove this TARGET_UNDERSCORE use at all. It would be always the
> default definition, which is for 32-bit wrong. Instead I replace in
> patch its use by bfd_get_symbol_leading_char(abfd). Updated patch
> comes soon, after testing.

So here is the new patch (tested for the same targets without
regression). I re-read documentation on msdn about _tls_used, and
there is no special-casing for x64, which means that they are doing in
their linker here the same magic - the _tls_used is a C-symbol.

Ok for apply?

Kai

-- 
|  (\_/) This is Bunny. Copy and paste
| (='.'=) Bunny into your signature to help
| (")_(") him gain world domination
-------------- next part --------------
Index: src/bfd/peXXigen.c
===================================================================
--- src.orig/bfd/peXXigen.c	2010-12-21 10:08:50.000000000 +0100
+++ src/bfd/peXXigen.c	2010-12-21 15:07:46.752622600 +0100
@@ -82,6 +82,11 @@
 #include "libcoff.h"
 #include "libpei.h"
 
+/* Make sure we have default definition.  */
+#ifndef TARGET_UNDERSCORE
+#define TARGET_UNDERSCORE 0
+#endif
+
 #if defined COFF_WITH_pep || defined COFF_WITH_pex64
 # undef AOUTSZ
 # define AOUTSZ		PEPAOUTSZ
@@ -2418,7 +2423,9 @@ _bfd_XXi_final_link_postscript (bfd * ab
     }
 
   h1 = coff_link_hash_lookup (coff_hash_table (info),
-			      "__tls_used", FALSE, FALSE, TRUE);
+			      (bfd_get_symbol_leading_char(abfd) != 0
+			       ? "__tls_used" : "_tls_used"),
+			      FALSE, FALSE, TRUE);
   if (h1 != NULL)
     {
       if ((h1->root.type == bfd_link_hash_defined
Index: src/ld/testsuite/ld-pe/pe.exp
===================================================================
--- src.orig/ld/testsuite/ld-pe/pe.exp	2010-04-07 09:31:26.000000000 +0200
+++ src/ld/testsuite/ld-pe/pe.exp	2010-12-21 11:37:15.851325100 +0100
@@ -38,6 +38,8 @@ if {[istarget i*86-*-cygwin*]
 	 {{objdump -s secrel_64.d}} "secrel.x"}
 	{"Empty export table" "" "" "exports.s"
 	 {{objdump -p exports64.d}} "exports.dll"}
+	{"TLS directory entry" "" "" "tlssec.s"
+	 {{objdump -p tlssec64.d}} "tlssec.dll"}
       }
     } elseif {[istarget i*86-*-cygwin*] } {
       set pe_tests {
@@ -45,6 +47,8 @@ if {[istarget i*86-*-cygwin*]
 	 {{objdump -s secrel.d}} "secrel.x"}
 	{"Empty export table" "" "" "exports.s"
 	 {{objdump -p exports.d}} "exports.dll"}
+	{"TLS directory entry" "" "" "tlssec.s"
+	 {{objdump -p tlssec32.d}} "tlssec.dll"}
       }
     } else {
       set pe_tests {
@@ -52,6 +56,8 @@ if {[istarget i*86-*-cygwin*]
 	 {{objdump -s secrel.d}} "secrel.x"}
 	{"Empty export table" "" "" "exports.s"
 	 {{objdump -p exports.d}} "exports.dll"}
+	{"TLS directory entry" "" "" "tlssec.s"
+	 {{objdump -p tlssec32.d}} "tlssec.dll"}
       }
     }
 
Index: src/ld/testsuite/ld-pe/tlssec.s
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ src/ld/testsuite/ld-pe/tlssec.s	2010-12-21 11:29:09.770089200 +0100
@@ -0,0 +1,20 @@
+.global _tls_used
+.global __tls_used
+.global _start
+.global start
+.global _mainCRTStartup
+.global mainCRTStartup
+
+.text
+_start:
+mainCRTStartup:
+_mainCRTStartup:
+        .byte 1
+
+.section .tls
+_tls_used:
+__tls_used:
+.long 1,2,3,4,5,6,7,8,9,10
+.long 11,12,13,14,15,16,17,18,19,20
+.long 21,22,23,24,25,26,27,28,29,30
+
Index: src/ld/testsuite/ld-pe/tlssec32.d
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ src/ld/testsuite/ld-pe/tlssec32.d	2010-12-21 11:53:41.935250500 +0100
@@ -0,0 +1,3 @@
+#...
+Entry 9 00003000 00000018 Thread Storage Directory \[\.tls\]
+#...
Index: src/ld/testsuite/ld-pe/tlssec64.d
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ src/ld/testsuite/ld-pe/tlssec64.d	2010-12-21 11:34:21.131456900 +0100
@@ -0,0 +1,3 @@
+#...
+Entry 9 0000000000003000 00000028 Thread Storage Directory \[\.tls\]
+#...


More information about the Binutils mailing list