delorie.com/archives/browse.cgi   search  
Mail Archives: cygwin/2015/01/19/09:42:46

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--

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019