【问题标题】:What is the "___emutls_get_address" symbol?什么是“__emutls_get_address”符号?
【发布时间】:2011-12-14 16:12:42
【问题描述】:

哦,我是 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++ 应该自己选择正确的。尝试删除它。
  • 我尝试从“DeepLearning4j 示例”项目和行“DataSetIterator iterator = new RecordReaderDataSetIterator(recordReader,batchSize,labelIndex,numClasses); logger.info("test point 3."); 之后启动 CSVExample数据集 allData = iterator.next();"收到:“dyld:惰性符号绑定失败:找不到符号:___emutls_get_address 引用自:/Users/firstname/.javacpp/cache/nd4j-native-1.0.0-beta5-macosx-x86_64.jar/org/nd4j/nativeblas/ macosx-x86_64/libnd4jcpu.dylib 预期在:/usr/lib/libSystem.B.dylib" 在 macOS 10.15 和 OpenJDK 运行时环境 build 14...
  • ...并升级到 Xcode 版本 11.1 11A11027。
  • 将org.deeplearning4j的版本从1.0.0-beta5升级到1.0.0-beta6后就ok了。

标签: macos gcc linker undefined-symbol


【解决方案1】:

这个符号是 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

从上面的线程来看,这显然是一团糟。然而,正如我刚刚 通过这一点,我希望有一个跟踪问题的错误有用。

...

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

因此,一种可能的解决方案是将-lgcc_s.so.1-lgcc_eh 选项添加到链接步骤。还有就是更新你的gcc,因为这是gcc的bug。

【讨论】:

  • 这两个库我都试过了,第一个没找到。使用第二个后,现在可以找到 emutls 符号,但 GCC 继续抱怨“在可滑动图像中不允许使用来自 michael.o 的 _DescRetire 中的绝对寻址(可能是 -mdynamic-no-pic)。使用 '-read_only_relocs 抑制' 启用文本遗物”,我仍然不知道。
  • JustQieTry,我认为这是来自 ' -fno-pic ' 选项。尝试在没有此选项的情况下重新编译您的项目。您尝试构建 .so 库并且任何动态库都应该在 -fpic 模式下编译。
  • 如果 -fpic 打开,还有另一个问题,它抱怨“在重新加载 'asm' 时找不到类 'BREG' 中的寄存器”,我用谷歌搜索并找到了 mac ,-fpic默认是开启的,所以我把它关了.......是不是错了?
  • JustQieTry,错误的是你不应该在没有'-fpic'的情况下构建动态库。这是因为动态库可以在任何起始地址加载并且在所有情况下都是正确的,必须使用与位置无关的代码(缩写为 pic,选项为 -fpic)。你能显示有错误的asm语句吗?
  • people.cs.vt.edu/~scschnei/streamflow 我用这个 url 下的 michael.tar,并尝试在 Mac 中构建它,然后显示 'ask' 问题,然后我将其切换到 Linux,它可以构建,但是在做动态链接时,编译器告诉我跳过不兼容的库...
猜你喜欢
  • 2010-09-09
  • 2012-09-23
  • 2010-11-23
  • 1970-01-01
  • 2010-09-09
  • 2012-04-19
  • 2021-02-13
  • 1970-01-01
  • 2013-04-30
相关资源
最近更新 更多