簡體   English   中英

TLS變量上的“非常線程局部引用常規符號”錯誤

[英]“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
}

可能導致此鏈接器問題的原因是什么,是否有解決方法? 我似乎無法找到任何與此相關的錯誤報告。

筆記:

  • 這純粹是使用Apple LLVM 7.0.0
  • 在OS X上使用gcc 5或gcc 4.9.3鏈接沒有問題

編輯引用全局(而不是靜態類)變量時存在同樣的問題。

當我使用thread_local代替__thread ,這樣可以正常工作,但是thread_local不能與Xcode附帶的LLVM版本一起使用。

蘋果可執行文件格式(我相信MACH-O)不允許Thread本地存儲。 這是一個痛苦的屁股。 您必須在線程庫的內存分配中創建空間並在其中隱藏線程局部變量。 它非常模糊。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM