私のアプリケーションは、シンボルが見つからないと文句を言います:
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を実際に持つライブラリも見つけました。これは /usr/lib にある libCstd.so です。または、より正確に言うと (64 ビット版が必要なので) /usr/lib/64. そのため、crle によって表示されるシステムのデフォルトのライブラリ検索パスの 1 つにあります。ここでの問題は、それを含むライブラリがシステムの検索パスにある場合、どのようにしてシンボルを解決できないのでしょうか?