"___emutls_get_address"符号是什么?

15

哦,我是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

你不需要显式链接-lstdc ++,g++应该会自动选择正确的库。可以尝试移除这个链接选项。 - Mat
我尝试从“DeepLearning4j Examples”项目启动CSVExample,但在以下代码行之后:“DataSetIterator iterator = new RecordReaderDataSetIterator(recordReader, batchSize, labelIndex, numClasses); logger.info("test point 3."); DataSet allData = iterator.next();”,在macOS 10.15和OpenJDK Runtime Environment build 14环境下出现错误信息: “dyld:lazy symbol binding failed:Symbol not found: ___emutls_get_address Referenced from: / Users / firstname / .javacpp / cache / nd4j-native-1.0.0-beta5-macosx-x86_64.jar / org / nd4j / nativeblas / macosx-x86_64 / libnd4jcpu.dylib Expected in:/usr/lib/libSystem.B.dylib”。 - Oleksii Kyslytsyn
升级至Xcode版本11.1 11A11027。 - Oleksii Kyslytsyn
将 org.deeplearning4j 的版本从 1.0.0-beta5 升级到 1.0.0-beta6 后,一切正常。 - Oleksii Kyslytsyn
1个回答

12

此符号是gcc在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

从上面的线程可以看出,这显然是一个混乱的问题。然而,因为我刚刚被这个问题困扰了,所以我希望有一个跟踪该问题的错误报告。

...

如果我像上面提到的那样手动链接到gcc_s.so.1或gcc_eh,则TLS运行良好。

因此,可能的解决方案之一是在链接步骤中添加-lgcc_s.so.1-lgcc_eh选项。另一个解决方案是更新您的gcc,因为这是gcc的错误。


我已经尝试了这两个库,第一个没有找到。在使用第二个库后,emutls符号现在可以找到,但是GCC仍然抱怨“绝对寻址(也许是-mdynamic-no-pic)在michael.o的_DescRetire中不允许在可滑动映像中使用。使用“-read_only_relocs suppress”来启用文本遗迹”,我还没有头绪。 - JustQieTry
1
JustQieTry,我认为这是来自“-fno-pic”选项。尝试重新编译您的项目,不使用此选项。您正在尝试构建.so库,任何动态库都应该在-fpic模式下编译。 - osgx
如果-fpic打开,还有另一个问题,它会抱怨“在重新加载‘asm’时无法找到类‘BREG’中的寄存器”,我搜索了一下发现对于Mac来说,默认情况下-fpic是打开的,所以我将其关闭……这样做是否有错? - JustQieTry
JustQieTry,错误在于您不应该在没有使用“-fpic”选项的情况下构建动态库。这是因为动态库可以在任何起始地址加载,并且为了在所有情况下正确,必须使用位置无关代码(pic,选项为-fpic)。您能否展示出现错误的汇编语句? - osgx
1
我使用此URL下的michael.tar,并尝试在Mac上构建它,然后出现了“ask”问题,然后我将其切换到Linux,可以构建,但在进行动态链接时,编译器告诉我跳过不兼容的lib... - JustQieTry
找到了Mac OS X库文件中的-lgcc_s.1,但并没有解决运行时错误。对我来说,-lgcc_eh是个宝贝 - 谢谢! - Martin Dorey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接