【问题标题】:symbol not found (ldd), but it's there (nm)未找到符号 (ldd),但它存在 (nm)
【发布时间】:2014-02-18 20:01:09
【问题描述】:

我的应用程序抱怨找不到符号:

fatal: relocation error: file /foo/libxslt4c.so.113: symbol __1cDstdEcout_: referenced symbol not found (bar.c:1330)

ldd 也是这么说的:

ldd -d /bar/libxmllib.so
        libc.so.1 =>     /lib/sparcv9/libc.so.1
        [...]
        libxml4c.so.58 =>        /foo/libxml4c.so.58
        libxslt4c.so.113 =>      /foo/libxslt4c.so.113
        [...]
        /platform/SUNW,SPARC-Enterprise/lib/sparcv9/libc_psr.so.1
        /lib/sparcv9/../libm/sparcv9/libm_hwcap1.so.2
        symbol not found: __1cDstdEcout_                (/foo/libxslt4c.so.113)
        symbol not found: __1cDstdEcerr_                (/foo/libxslt4c.so.113)

但是,符号在那里 - 这就是 nm 所说的:

nm /foo/libxslt4c.so.113.0 | grep __1cDstdEcerr_
[10915] |                   0|                   0|OBJT |GLOB |0    |UNDEF  |__1cDstdEcerr_

但如您所见:Shndx=UNDEF。那是什么意思?我想如果某些东西是未定义的,那它根本就不存在。但不知何故它就在那里,虽然我的应用程序找不到它。

系统:Solaris 10 / UltraSPARC 我的应用程序和所有库都是 64 位的,/foo 在 LD_LIBRARY_PATH_64 中(/bar 不在)。

编辑:同时我知道 UNDEF 就像“需要在另一个库中解决”。而且我还发现了真正具有符号 _1cDstdEcerr 的库 - 它是 libCstd.so,它位于 /usr/lib 中。或者更准确地说(因为我们需要 64 位变体)/usr/lib/64.因此它位于 crle 显示的系统默认库搜索路径之一中。现在的问题是:当包含符号的库在系统的搜索路径中时,如何不解析符号?

【问题讨论】:

  • 系统不会在库路径中搜索所有可能的库中的符号,只搜索程序或共享对象链接的符号,如elfdump -d /bar/libxmllib.so 所列。

标签: solaris symbols solaris-10 ldd nm


【解决方案1】:

这可能是因为您没有在编译中包含它 传递给链接器的标志。

如果你有

LDFLAGS += -lCstd

在你的 Makefile 中,那么它应该已经被传递并且链接器会 做了正确的事(假设您使用的是标准编译 将$(LDFLAGS) 附加到编译器和链接器调用的规则)。

【讨论】:

  • 谢谢,但“我的应用程序”实际上是 IBM 的专有软件。当然,我不确定他们的 LDFLAGS,但我很确定他们已经正确构建了软件。问题在于我的 Solaris 环境。
  • 问题几乎肯定不是您的 Solaris 环境,而是应用程序的构建方式。您可以使用 elfdump -d /path/to/application 检查应用程序的复杂内部结构。 RUNPATH 或 RPATH 条目将帮助您确定它在哪里寻找 libCstd.so。有时(我在 Solaris 上看到了打包不良的 GNU 软件),您可能会发现运行路径是乱码。幸运的是......您可以使用elfedit 实用程序来解决此类问题。 Solaris 链接器团队之一写了一篇关于该工具的大量文章,这真的很有帮助:goo.gl/RgxIy8
  • 你完全正确。 IBM 解决了这个问题并向我们发送了一个新的库。非常感谢你,詹姆斯!
猜你喜欢
  • 1970-01-01
  • 2011-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-16
  • 2011-01-20
  • 2017-11-14
  • 2021-07-22
相关资源
最近更新 更多