Приложението ми се оплаква от символ, който не може да намери:
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
. - person alanc   schedule 19.02.2014