什么是"___emutls_get_address"符号?

Jus*_*Try 8 macos linker gcc undefined-symbol

哦,我是GCC和MAC和Makefile的新手.今天我打算使用MAC OS X和GCC 4.4.2构建一个动态库,但是当链接.o文件时,编译器抱怨如下:

Undefined symbols:
  "___emutls_get_address", referenced from:
      _malloc in michael.o
      _malloc in michael.o
ld: symbol(s) not found
Run Code Online (Sandbox Code Playgroud)

我用谷歌搜索了这个信息,但我无法理解结果,我想知道这个符号是什么意思,以及为什么很多程序都有这个链接错误.我也想知道这个错误的可能原因是什么,链接命令是:

g++ -Dx86 -D_GNU_SOURCE -D_REENTRANT  -Wall -m32 \
    -fno-strict-aliasing -fno-pic -O3 -ggdb \
    michael.o malloc_new.o -o libmichael.so \
    -lpthread -lm -lstdc++  -shared
Run Code Online (Sandbox Code Playgroud)

osg*_*sgx 7

此符号是gcc for Mac Os X的TLS(线程局部存储)仿真的一部分.gcc bugzilla中有一些关于此的错误,例如:http://gcc.gnu.org/bugzilla/show_bug.cgi?id = 39888

在Darwin上使用线程本地存储(例如OpenMP ThreadPrivate变量)需要通过-lgcc_s.so.1或-lgcc_eh手动链接到TLS emutls

请参阅主题:http : //gcc.gnu.org/ml/gcc/2008-12/msg00145.html http://gcc.gnu.org/ml/gcc/2008-12/msg00107.html

从上面的话题来看,这显然是一团糟.但是,正如我刚才所说,我希望有一个跟踪问题的bug是有用的.

...

如果我手动链接到gcc_s.so.1或gcc_eh如上所述,TLS工作正常.

因此,可能的解决方案之一是添加 -lgcc_s.so.1-lgcc_eh选择链接步骤.另一个是更新你的gcc,因为这是gcc的bug.