2015-12-10 4 views
13

पर त्रुटि मेरे पास एक अजीब समस्या है जो लिंकिंग के दौरान होती है।"नियमित प्रतीक के लिए अवैध धागा-स्थानीय संदर्भ" एक टीएलएस चर

struct Foo { static __thread int x; } 

और एक स्रोत फ़ाइल जो संदर्भ चर plugin.cpp:

$CXX -stdlib=libc++ -std=c++11 -fvisibility=hidden -fPIC -o plugin.cpp.o -c plugin.cpp 
:

#include "foo.hpp" 
void bar() { int y = Foo::x; } 

यह साथ ठीक संकलित

मुझे लगता है कि निम्नलिखित परिभाषा foo.hpp शामिल एक हेडर फाइल है

लेकिन जब मैं गतिशील पुस्तकालय के रूप में लिंक करने का प्रयास करता हूं y:

$CXX -stdlib=libc++ -std=c++11 -fvisibility=hidden -dynamiclib -Wl,-undefined,dynamic_lookup -o libext.dylib ext.cpp.o 

मैं:

ld: वास्तुकला x86_64 के लिए __ZN3Foo1xE नियमित प्रतीक करने के लिए अवैध धागा स्थानीय चर संदर्भ

हालांकि LLVM बाईटकोड का तात्पर्य है कि संकलक सही ढंग से देख रही है एक टीएलएस चर के रूप में Foo::x

$CXX -stdlib=libc++ -std=c++11 -fvisibility=hidden -fPIC -S -emit-llvm -o - 
... omitted 
@_ZN3Foo1xE = external thread_local global i32 
... omitted 
; Function Attrs: nounwind ssp uwtable 
define hidden void @_Z3barv() #0 { 
    %y = alloca i32, align 4 
    %1 = load i32* @_ZN3Foo1xE, align 4 
    store i32 %1, i32* %y, align 4 
    ret void 
} 

इस लिंकर मुद्दे का कारण क्या हो सकता है, और क्या कोई कामकाज है? मुझे इससे संबंधित कोई भी बग रिपोर्ट नहीं मिल रही है।

नोट्स:

  • यह विशुद्ध रूप से एप्पल LLVM 7.0.0
  • उपयोग कर रहा है मैं कोई समस्या नहीं ओएस एक्स

संपादित करें पर या तो जीसीसी 5 या जीसीसी 4.9.3 का उपयोग कर जोड़ने है एक वैश्विक समस्या (स्थैतिक वर्ग के बजाय) चर संदर्भित करते समय भी वही समस्या मौजूद है।

जब मैं __thread के स्थान पर thread_local उपयोग करते हैं, यह ठीक काम करता है, फिर भी thread_local LLVM का संस्करण Xcode के साथ जहाजों के साथ काम नहीं करता।

+0

यदि आप 'Foo :: x' को वैश्विक चर बनाते हैं तो क्या होता है? यदि यह काम करता है तो आप इसे वैश्विक रूप से छोड़ सकते हैं, या इसे 'foo' में एक स्थिर गेटर फ़ंक्शन के साथ foo.cpp पर स्थानीय (स्थिर या अनाम नामस्थान) प्राप्त कर सकते हैं। मैं बस अनुमान लगा रहा हूँ; शायद संकलक स्थिर __thread सदस्य चर के साथ एक समस्या है। – 1201ProgramAlarm

+0

@ 1201 प्रोग्राम अलार्म: मुझे इसे प्रश्न में रखना चाहिए था। एक वैश्विक चर का उपयोग करना एक ही समस्या पैदा करता है। बेशक, उपयोग के मामले के बराबर बनाने के लिए, घोषणा 'बाहरी __thread int my_global है; ' –

+0

आपने केवल एक्स चर घोषित किया है, हमें इसकी परिभाषा दिखाएं। डोनट्स के लिए डॉलर, आप परिभाषा में __thread भूल गए। या आप इसे पूरी तरह से भूल गए हैं और एक लुसी लिंकर डायग्नोस्टिक मिला है। –

उत्तर

0

सेब निष्पादन योग्य फ़ाइल प्रारूप (MACH-O मुझे विश्वास है) थ्रेड स्थानीय संग्रहण की अनुमति नहीं देता है। यह गधे में दर्द है। आपको थ्रेडिंग लाइब्रेरी की स्मृति आवंटन में स्थान बनाना है और वहां थ्रेड स्थानीय चर को छिपाना है। यह बहुत ही अस्पष्ट है।

+0

एक लिंक जो इसका वर्णन करना चाहिए। https://software.intel.com/en-us/forums/intel-c-compiler/topic/498638 –

संबंधित मुद्दे