[英]“illegal thread-local reference to regular symbol” error on a TLS variable
我在鏈接期間發生了一個奇怪的問題。
我有一個頭文件,其中包含以下定義foo.hpp
:
struct Foo { static __thread int x; }
以及引用該變量plugin.cpp
的源文件:
#include "foo.hpp"
void bar() { int y = Foo::x; }
編譯很好:
$CXX -stdlib=libc++ -std=c++11 -fvisibility=hidden -fPIC -o plugin.cpp.o -c plugin.cpp
但是當我嘗試鏈接為動態庫時:
$CXX -stdlib=libc++ -std=c++11 -fvisibility=hidden -dynamiclib -Wl,-undefined,dynamic_lookup -o libext.dylib ext.cpp.o
我明白了:
ld:非法線程局部變量引用常規符號__ZN3Foo1xE,用於體系結構x86_64
但是llvm字節碼意味着編譯器正確地將Foo::x
視為TLS變量。
$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
}
可能導致此鏈接器問題的原因是什么,是否有解決方法? 我似乎無法找到任何與此相關的錯誤報告。
筆記:
編輯引用全局(而不是靜態類)變量時存在同樣的問題。
當我使用thread_local
代替__thread
,這樣可以正常工作,但是thread_local
不能與Xcode附帶的LLVM版本一起使用。
蘋果可執行文件格式(我相信MACH-O)不允許Thread本地存儲。 這是一個痛苦的屁股。 您必須在線程庫的內存分配中創建空間並在其中隱藏線程局部變量。 它非常模糊。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.