什么是“___emutls_get_address”符号?

时间:2011-10-25 05:59:00

标签: macos gcc linker 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

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

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

1 个答案:

答案 0 :(得分:5)

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

  

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

     

查看主题:   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的错误。