From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 87025 invoked by alias); 14 Nov 2019 18:23:04 -0000 Mailing-List: contact cygwin-help@cygwin.com; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: cygwin-owner@cygwin.com Mail-Followup-To: cygwin@cygwin.com Received: (qmail 87010 invoked by uid 89); 14 Nov 2019 18:23:04 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-1.9 required=5.0 tests=BAYES_00,SPF_HELO_PASS,SPF_PASS autolearn=ham version=3.3.1 spammy=one, th, one!, H*c:HHHH X-HELO: ppsw-43.csi.cam.ac.uk Received: from ppsw-43.csi.cam.ac.uk (HELO ppsw-43.csi.cam.ac.uk) (131.111.8.143) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 14 Nov 2019 18:23:02 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=cam.ac.uk; s=20180806.ppsw; h=Content-Type:MIME-Version:Message-ID:Subject:To:From:Date :Sender:Reply-To:Cc:Content-Transfer-Encoding:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: In-Reply-To:References:List-Id:List-Help:List-Unsubscribe:List-Subscribe: List-Post:List-Owner:List-Archive; bh=fcorSGnjPSKeTfw4nPWTZMfBoKjN4cO2vrjfAiH0ug0=; b=MaWOGwG4j/WChhv113aNlLqF4m eiCBgh6Qq+doncgZqjpP+Ei3b8GhLISU6aEqT4+n4UTct2lQX9kRVC0depJCjUDVc4+Cs60U6Hf5Y gnyxyFOjWUyx0AlRo9Ekze970kJT/XxX+OJYpzfde6++bC8dMrZUu08qFNvPbLBgyEGU=; Received: from host86-169-144-100.range86-169.btcentralplus.com ([86.169.144.100]:5129 helo=panamint) by ppsw-43.csi.cam.ac.uk (smtp.hermes.cam.ac.uk [131.111.8.159]:465) with esmtpsa (PLAIN:acn1) (TLSv1.2:ECDHE-RSA-AES256-GCM-SHA384:256) id 1iVJlk-001Ub3-mj (Exim 4.92.3) for cygwin@cygwin.com (return-path ); Thu, 14 Nov 2019 18:23:00 +0000 Date: Thu, 14 Nov 2019 18:41:00 -0000 From: Arthur Norman To: cygwin@cygwin.com Subject: linker fails with multiple definitions after inline thread_local var within class Message-ID: User-Agent: Alpine 2.00 (WNT 1167 2008-08-23) MIME-Version: 1.0 Content-Type: MULTIPART/MIXED; BOUNDARY="426969-2287-1573755781=:14912" X-IsSubscribed: yes X-SW-Source: 2019-11/txt/msg00077.txt.bz2 --426969-2287-1573755781=:14912 Content-Type: TEXT/PLAIN; format=flowed; charset=US-ASCII Content-length: 2890 #! /bin/bash # When I run this on Ubuntu-x86_64, Macintosh(clang) or a Raspberry pi # the code links and when it runs it just prints 999 - which is the behaviour # that I expect. On both Cygwin and using x86_64-w64-mingw32-g++ (and i686) # I get a linker diagnostic of the form # ./tltest.sh # /usr/lib/gcc/x86_64-pc-cygwin/8.3.0/../../../../x86_64-pc-cygwin/bin/ld: # /tmp/cczVTcZ1.o:t2.cpp:(.text+0x86): multiple definition of # `TLS init function for Data::valref'; # /tmp/ccyLQlRb.o:t1.cpp:(.text+0x4a): first defined here # collect2: error: ld returned 1 exit status # # I believe that given the specification of C++17 "inline" variables this # is incorrect, but there are better experts who may be able to explain # otherwise. # # When people raise issues here I often see other asking "Why are you doing # that?". This is a cut-down version of my real code where rather than # storing a reference to the thread_local Record that I am interested in # in a simple array (tvec) at a fixed offset (1) I store and retrieve a # referece to it using TlsAlloc(), TlsGetValue and TlsSetValue - those being # the Microsoft API for thread-local access, and for my purposes my # measurements suggest that using them gives me useful performance gains # over the emutls code that g++ creates on the relevant platforms. # And I am then (trying to) build a header-only library (for which t.h is # the surrogate here) which can be included from several other compilation # units but by virtue of "inline variables" its private (including thread- # local) date can be defined within that header file so that the files that # #include the header-only library do not need to contain anything beyond # uses of it. To illustrate this I have two source files which each include # t.h but the bad behaviour does not need any other code in the first one! # The second just contains a tiny main program that inspects data from the # library data. # Have I misunderstood C++ and so am I doing something wrong or is this # a g++/Windows bug? cat < t.h #include inline void *tvec[4]; class Record { public: int val = 999; }; class Data_Ref { static inline thread_local Record val; public: static Record* get() // Get reference to Record via tvec[] { return (Record*)tvec[1]; } Data_Ref() // Stash it in tvec[] for later use { tvec[1] = (void *)&val; } }; class Data { static inline thread_local Data_Ref valref; public: static Record &get() { return *valref.get(); // note that get() is static in Data_Ref } }; XXX cat < t1.cpp #include #include "t.h" // First copy XXX cat < t2.cpp #include #include "t.h" // Second copy int main() { std::cout << Data::get().val << std::endl; return 0; } XXX ${1:-g++} -std=c++17 -I. t1.cpp t2.cpp -o t ./t # end of test script --426969-2287-1573755781=:14912 Content-Type: APPLICATION/octet-stream; name=tltest.sh Content-Transfer-Encoding: BASE64 Content-ID: Content-Description: Content-Disposition: attachment; filename=tltest.sh Content-length: 3904 IyEgL2Jpbi9iYXNoCiMgV2hlbiBJIHJ1biB0aGlzIG9uIFVidW50dS14ODZf NjQsIE1hY2ludG9zaChjbGFuZykgb3IgYSBSYXNwYmVycnkgcGkKIyB0aGUg Y29kZSBsaW5rcyBhbmQgd2hlbiBpdCBydW5zIGl0IGp1c3QgcHJpbnRzIDk5 OSAtIHdoaWNoIGlzIHRoZSBiZWhhdmlvdXIKIyB0aGF0IEkgZXhwZWN0LiBP biBib3RoIEN5Z3dpbiBhbmQgdXNpbmcgeDg2XzY0LXc2NC1taW5ndzMyLWcr KyAgKGFuZCBpNjg2KQojIEkgZ2V0IGEgbGlua2VyIGRpYWdub3N0aWMgb2Yg dGhlIGZvcm0KIyAuL3RsdGVzdC5zaAojIC91c3IvbGliL2djYy94ODZfNjQt cGMtY3lnd2luLzguMy4wLy4uLy4uLy4uLy4uL3g4Nl82NC1wYy1jeWd3aW4v YmluL2xkOgojICAgL3RtcC9jY3pWVGNaMS5vOnQyLmNwcDooLnRleHQrMHg4 Nik6IG11bHRpcGxlIGRlZmluaXRpb24gb2YKIyAgIGBUTFMgaW5pdCBmdW5j dGlvbiBmb3IgRGF0YTo6dmFscmVmJzsKIyAgIC90bXAvY2N5TFFsUmIubzp0 MS5jcHA6KC50ZXh0KzB4NGEpOiBmaXJzdCBkZWZpbmVkIGhlcmUKIyBjb2xs ZWN0MjogZXJyb3I6IGxkIHJldHVybmVkIDEgZXhpdCBzdGF0dXMKIwojIEkg YmVsaWV2ZSB0aGF0IGdpdmVuIHRoZSBzcGVjaWZpY2F0aW9uIG9mIEMrKzE3 ICJpbmxpbmUiIHZhcmlhYmxlcyB0aGlzCiMgaXMgaW5jb3JyZWN0LCBidXQg dGhlcmUgYXJlIGJldHRlciBleHBlcnRzIHdobyBtYXkgYmUgYWJsZSB0byBl eHBsYWluCiMgb3RoZXJ3aXNlLgojCiMgV2hlbiBwZW9wbGUgcmFpc2UgaXNz dWVzIGhlcmUgSSBvZnRlbiBzZWUgb3RoZXIgYXNraW5nICJXaHkgYXJlIHlv dSBkb2luZwojIHRoYXQ/Ii4gVGhpcyBpcyBhIGN1dC1kb3duIHZlcnNpb24g b2YgbXkgcmVhbCBjb2RlIHdoZXJlIHJhdGhlciB0aGFuCiMgc3RvcmluZyBh IHJlZmVyZW5jZSB0byB0aGUgdGhyZWFkX2xvY2FsIFJlY29yZCB0aGF0IEkg YW0gaW50ZXJlc3RlZCBpbgojIGluIGEgc2ltcGxlIGFycmF5ICh0dmVjKSBh dCBhIGZpeGVkIG9mZnNldCAoMSkgSSBzdG9yZSBhbmQgcmV0cmlldmUgYQoj IHJlZmVyZWNlIHRvIGl0IHVzaW5nIFRsc0FsbG9jKCksIFRsc0dldFZhbHVl IGFuZCBUbHNTZXRWYWx1ZSAtIHRob3NlIGJlaW5nCiMgdGhlIE1pY3Jvc29m dCBBUEkgZm9yIHRocmVhZC1sb2NhbCBhY2Nlc3MsIGFuZCBmb3IgbXkgcHVy cG9zZXMgbXkKIyBtZWFzdXJlbWVudHMgc3VnZ2VzdCB0aGF0IHVzaW5nIHRo ZW0gZ2l2ZXMgbWUgdXNlZnVsIHBlcmZvcm1hbmNlIGdhaW5zCiMgb3ZlciB0 aGUgZW11dGxzIGNvZGUgdGhhdCBnKysgY3JlYXRlcyBvbiB0aGUgcmVsZXZh bnQgcGxhdGZvcm1zLgojIEFuZCBJIGFtIHRoZW4gKHRyeWluZyB0bykgYnVp bGQgYSBoZWFkZXItb25seSBsaWJyYXJ5IChmb3Igd2hpY2ggdC5oIGlzCiMg dGhlIHN1cnJvZ2F0ZSBoZXJlKSB3aGljaCBjYW4gYmUgaW5jbHVkZWQgZnJv bSBzZXZlcmFsIG90aGVyIGNvbXBpbGF0aW9uCiMgdW5pdHMgYnV0IGJ5IHZp cnR1ZSBvZiAiaW5saW5lIHZhcmlhYmxlcyIgaXRzIHByaXZhdGUgKGluY2x1 ZGluZyB0aHJlYWQtCiMgbG9jYWwpIGRhdGUgY2FuIGJlIGRlZmluZWQgd2l0 aGluIHRoYXQgaGVhZGVyIGZpbGUgIHNvIHRoYXQgdGhlIGZpbGVzIHRoYXQK IyAjaW5jbHVkZSB0aGUgaGVhZGVyLW9ubHkgbGlicmFyeSBkbyBub3QgbmVl ZCB0byBjb250YWluIGFueXRoaW5nIGJleW9uZAojIHVzZXMgb2YgaXQuIFRv IGlsbHVzdHJhdGUgdGhpcyBJIGhhdmUgdHdvIHNvdXJjZSBmaWxlcyB3aGlj aCBlYWNoIGluY2x1ZGUKIyB0LmggYnV0IHRoZSBiYWQgYmVoYXZpb3VyIGRv ZXMgbm90IG5lZWQgYW55IG90aGVyIGNvZGUgaW4gdGhlIGZpcnN0IG9uZSEK IyBUaGUgc2Vjb25kIGp1c3QgY29udGFpbnMgYSB0aW55IG1haW4gcHJvZ3Jh bSB0aGF0IGluc3BlY3RzIGRhdGEgZnJvbSB0aGUKIyBsaWJyYXJ5IGRhdGEu CgojIEhhdmUgSSBtaXN1bmRlcnN0b29kIEMrKyBhbmQgc28gYW0gSSBkb2lu ZyBzb21ldGhpbmcgd3Jvbmcgb3IgaXMgdGhpcwojIGEgZysrL1dpbmRvd3Mg YnVnPwoKY2F0IDw8WFhYID4gdC5oCiNpbmNsdWRlIDxjc3RkaW50PgoKaW5s aW5lIHZvaWQgKnR2ZWNbNF07CgpjbGFzcyBSZWNvcmQKewpwdWJsaWM6CiAg ICBpbnQgdmFsID0gOTk5Owp9OwoKY2xhc3MgRGF0YV9SZWYKeyAgIHN0YXRp YyBpbmxpbmUgdGhyZWFkX2xvY2FsIFJlY29yZCB2YWw7CnB1YmxpYzoKICAg IHN0YXRpYyBSZWNvcmQqIGdldCgpICAvLyBHZXQgcmVmZXJlbmNlIHRvIFJl Y29yZCB2aWEgdHZlY1tdCiAgICB7ICAgcmV0dXJuIChSZWNvcmQqKXR2ZWNb MV07CiAgICB9CiAgICBEYXRhX1JlZigpICAgICAgICAgICAgLy8gU3Rhc2gg aXQgaW4gdHZlY1tdIGZvciBsYXRlciB1c2UKICAgIHsgICB0dmVjWzFdID0g KHZvaWQgKikmdmFsOwogICAgfQp9OwoKY2xhc3MgRGF0YQp7ICAgc3RhdGlj IGlubGluZSB0aHJlYWRfbG9jYWwgRGF0YV9SZWYgdmFscmVmOwpwdWJsaWM6 CiAgICBzdGF0aWMgUmVjb3JkICZnZXQoKQogICAgeyAgIHJldHVybiAqdmFs cmVmLmdldCgpOyAvLyBub3RlIHRoYXQgZ2V0KCkgaXMgc3RhdGljIGluIERh dGFfUmVmCiAgICB9Cn07CgpYWFgKY2F0IDw8WFhYID4gdDEuY3BwCiNpbmNs dWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgInQuaCIgIC8vIEZpcnN0IGNvcHkK ClhYWApjYXQgPDxYWFggPiB0Mi5jcHAKI2luY2x1ZGUgPGlvc3RyZWFtPgoj aW5jbHVkZSAidC5oIiAgLy8gU2Vjb25kIGNvcHkKCmludCBtYWluKCkKeyAg IHN0ZDo6Y291dCA8PCBEYXRhOjpnZXQoKS52YWwgPDwgc3RkOjplbmRsOwog ICAgcmV0dXJuIDA7Cn0KWFhYCgokezE6LWcrK30gLXN0ZD1jKysxNyAtSS4g dDEuY3BwIHQyLmNwcCAtbyB0Ci4vdAoKIyBlbmQgb2YgdGVzdCBzY3JpcHQ= --426969-2287-1573755781=:14912 Content-Type: text/plain; charset=us-ascii Content-length: 219 -- 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 --426969-2287-1573755781=:14912--