www.delorie.com/archives/browse.cgi | search |
X-Recipient: | archive-cygwin AT delorie DOT com |
DomainKey-Signature: | a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id |
:list-unsubscribe:list-subscribe:list-archive:list-post | |
:list-help:sender:mime-version:date:message-id:subject:from:to | |
:content-type; q=dns; s=default; b=Iv4ay2nVT9dgNqqQmW3dmdXVsceoI | |
1eJKqKK4meblVO55Pw04P1DKsnwVgBCyvPG6LY4JDKR/dYm8wjqel7t2HY6SylNm | |
X1j5/uXQ+/EhgDULE4ead8o9dK1zK6/0QwGX/rCC6e/o/iN3dTT+ag7pSVFLhvVM | |
Ycrz9FwLG75MCA= | |
DKIM-Signature: | v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id |
:list-unsubscribe:list-subscribe:list-archive:list-post | |
:list-help:sender:mime-version:date:message-id:subject:from:to | |
:content-type; s=default; bh=eB1t3ZbvbcTYGx3tJhjGEyQ+MGo=; b=G2f | |
sspoGSCr1mKAAunQYN2J995w7Z5tRVvy3jglFhI+9OAfwfcGEFTNbiXioDJz94Dk | |
dzOCx0nRBGgcFQMiIC2jPdT/2REGhpBalzviCOVC62ewOzMF6j4wzXCJ8xyr4ZUG | |
HvanA565Qo+5XsS612ugS+o0Brrv5H91vSzIgr28= | |
Mailing-List: | contact cygwin-help AT cygwin DOT com; run by ezmlm |
List-Id: | <cygwin.cygwin.com> |
List-Subscribe: | <mailto:cygwin-subscribe AT cygwin DOT com> |
List-Archive: | <http://sourceware.org/ml/cygwin/> |
List-Post: | <mailto:cygwin AT cygwin DOT com> |
List-Help: | <mailto:cygwin-help AT cygwin DOT com>, <http://sourceware.org/ml/#faqs> |
Sender: | cygwin-owner AT cygwin DOT com |
Mail-Followup-To: | cygwin AT cygwin DOT com |
Delivered-To: | mailing list cygwin AT cygwin DOT com |
Authentication-Results: | sourceware.org; auth=none |
X-Virus-Found: | No |
X-Spam-SWARE-Status: | No, score=-2.2 required=5.0 tests=AWL,BAYES_00,FREEMAIL_FROM,RCVD_IN_DNSWL_LOW,SPF_PASS autolearn=ham version=3.3.2 |
X-HELO: | mail-la0-f53.google.com |
MIME-Version: | 1.0 |
X-Received: | by 10.112.129.195 with SMTP id ny3mr32160146lbb.10.1421678537358; Mon, 19 Jan 2015 06:42:17 -0800 (PST) |
Date: | Mon, 19 Jan 2015 15:42:17 +0100 |
Message-ID: | <CAKw7uVhK6sizPHtctArcn6Gp62agQ1zKfcSHd0jK6w5DjnbU3A@mail.gmail.com> |
Subject: | C++11 thread_local implementation issue on Cygwin/AMD64 |
From: | =?UTF-8?Q?V=C3=A1clav_Zeman?= <vhaisman AT gmail DOT com> |
To: | cygwin AT cygwin DOT com |
X-IsSubscribed: | yes |
--047d7b3441c634984f050d025464 Content-Type: text/plain; charset=UTF-8 Hi. I have hit an issue with thread-local storage variables on Cygwin/AMD64, I do not see it with Cygwin/i686. I am having linking issues when using `thread_local` keyword in Cygwin with its GCC 4.8.3 and GCC 4.9.2. This is derived from log4cplus. The test case is split into three files: File def.hxx: ~~~~ #include <string> namespace N { struct S { std::string str; }; // extern declaration in a header extern thread_local S * ptd; // accessing the extern declared ptd here inline S * get_ptd () { if (! ptd) ptd = new S; return ptd; } } // namespace N ~~~~ File def.cxx: ~~~~ #include "def.hxx" namespace N { // definition of ptd thread_local S * ptd = nullptr; } // namespace N ~~~ File use.cxx: ~~~~ #include "def.hxx" namespace N { __declspec(dllexport) void * foo () { // invoking inline get_ptd() function to get the value in ptd return get_ptd (); } } ~~~~ Now, when I compile each .cxx with `g++ -std=gnu++11 -fvisibility=hidden -c use.cxx def.cxx` and then try to link with `g++ -shared -o cygtest.dll use.o def.o`, I get the following error from linker: ~~~~ use.o:use.cxx:(.text$_ZTWN1N3ptdE[_ZTWN1N3ptdE]+0x15): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `TLS init function for N::ptd' collect2: error: ld returned 1 exit status ~~~~ The nm -C ./def.o output confirms that: ~~~~ `--> nm -C ./def.o 0000000000000000 b .bss 0000000000000000 d .data 0000000000000000 r .rdata 0000000000000000 r .rdata$zzz 0000000000000000 t .text 0000000000000008 r __emutls_t._ZN1N3ptdE 0000000000000000 D __emutls_v._ZN1N3ptdE 0000000000000000 r std::piecewise_construct ~~~~ As you can see, the ptd thread-local variable initialization function is not defined anywhere. The use.o references this initialization function (see bottom of the listing): ~~~~ `--> nm -C ./use.o 0000000000000000 b .bss 0000000000000000 d .data 0000000000000000 i .drectve 0000000000000000 p .pdata 0000000000000000 p .pdata$_ZN1N1SC1Ev 0000000000000000 p .pdata$_ZN1N7get_ptdEv 0000000000000000 p .pdata$_ZTWN1N3ptdE 0000000000000000 r .rdata 0000000000000000 r .rdata$.refptr.__emutls_v._ZN1N3ptdE 0000000000000000 r .rdata$.refptr._ZTHN1N3ptdE 0000000000000000 r .rdata$zzz 0000000000000000 R .refptr.__emutls_v._ZN1N3ptdE 0000000000000000 R .refptr._ZTHN1N3ptdE 0000000000000000 t .text 0000000000000000 t .text$_ZN1N1SC1Ev 0000000000000000 t .text$_ZN1N7get_ptdEv 0000000000000000 t .text$_ZTWN1N3ptdE 0000000000000000 A .weak._ZTHN1N3ptdE._ZN1N1SC1Ev 0000000000000000 r .xdata 0000000000000000 r .xdata$_ZN1N1SC1Ev 0000000000000000 r .xdata$_ZN1N7get_ptdEv 0000000000000000 r .xdata$_ZTWN1N3ptdE U __emutls_get_address U __emutls_v._ZN1N3ptdE U __gxx_personality_seh0 U __real__ZdlPv U __real__Znwm U _Unwind_Resume U operator delete(void*) 0000000000000000 T N::S::S() 0000000000000000 T N::foo() 0000000000000000 T N::get_ptd() U std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string() U operator new(unsigned long) 0000000000000000 r std::piecewise_construct w TLS init function for N::ptd 0000000000000000 T TLS wrapper function for N::ptd ~~~~ Now, this code seems to work well on Linux with both GCC and Clang. Is this a GCC problem on Cygwin? Am I using extern thread_local wrong? My experiments show that not using the extern keyword seems to fix the issue. But I am not sure if that does not introduce two ptd thread-local variables in two TUs. See also http://stackoverflow.com/q/28023728/341065 -- VZ --047d7b3441c634984f050d025464 Content-Type: text/plain; charset=US-ASCII; name="def.cxx" Content-Disposition: attachment; filename="def.cxx" Content-Transfer-Encoding: base64 X-Attachment-Id: f_i53yols10 I2luY2x1ZGUgImRlZi5oeHgiCgpuYW1lc3BhY2UgTgp7CiAgdGhyZWFkX2xv Y2FsIFMgKiBwdGQgPSBudWxscHRyOwp9IC8vIG5hbWVzcGFjZSBOCg== --047d7b3441c634984f050d025464 Content-Type: text/plain; charset=US-ASCII; name="def.hxx" Content-Disposition: attachment; filename="def.hxx" Content-Transfer-Encoding: base64 X-Attachment-Id: f_i53yolug1 I2luY2x1ZGUgPHN0cmluZz4KCm5hbWVzcGFjZSBOCnsKICBzdHJ1Y3QgUyB7 IHN0ZDo6c3RyaW5nIHN0cjsgfTsKICBleHRlcm4gdGhyZWFkX2xvY2FsIFMg KiBwdGQ7CgogIGlubGluZQogIFMgKiBnZXRfcHRkICgpCiAgewogICAgaWYg KCEgcHRkKQogICAgICBwdGQgPSBuZXcgUzsKICAgIHJldHVybiBwdGQ7CiAg fQp9IC8vIG5hbWVzcGFjZSBOCg== --047d7b3441c634984f050d025464 Content-Type: text/plain; charset=US-ASCII; name="use.cxx" Content-Disposition: attachment; filename="use.cxx" Content-Transfer-Encoding: base64 X-Attachment-Id: f_i53yolul2 I2luY2x1ZGUgImRlZi5oeHgiCgpuYW1lc3BhY2UgTgp7CgogIF9fZGVjbHNw ZWMoZGxsZXhwb3J0KQogIHZvaWQgKiBmb28gKCkKICB7CiAgICByZXR1cm4g Z2V0X3B0ZCAoKTsKICB9Cn0K --047d7b3441c634984f050d025464 Content-Type: text/plain; charset=us-ascii -- Problem reports: http://cygwin.com/problems.html FAQ: http://cygwin.com/faq/ Documentation: http://cygwin.com/docs.html Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple --047d7b3441c634984f050d025464--
webmaster | delorie software privacy |
Copyright © 2019 by DJ Delorie | Updated Jul 2019 |