符号未找到(ldd),但它在那里(nm)

时间:2014-02-18 20:01:10

标签: solaris symbols solaris-10 ldd nm

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

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就像“需要在另一个lib中解决”。我还发现了一个真正具有符号_ 1cDstdEcerr 的库 - 它是libCstd.so,它位于/ usr / lib中。或者更精确(因为我们需要64位变体)/ usr / lib / 64。所以它是由crle显示的系统默认库搜索路径之一。现在的问题是:当包含它的lib在系统的搜索路径中时,如何解析符号?

1 个答案:

答案 0 :(得分:4)

它没有得到解决,大概是因为你没有将它包含在你的编译中 传递给链接器的标志。

如果你有

LDFLAGS += -lCstd
在你的Makefile中

,它应该已经传递,链接器将传递 做了正确的事情(假设您正在使用标准编译 将$(LDFLAGS)附加到编译器和链接器调用的规则。)