我在Solaris上使用第三方共享库(libsw_api.so),当我尝试加载时,会产生以下错误:
fatal: relocation error: file libsw_api.so:
symbol _ZNKSt9bad_alloc4whatEv: referenced symbol not found
The program exited with error code 1
当我在libsw_api.so上运行ldd时,所有引用似乎都已完成,特别是指向libstdc ++的C ++标准库.so.6.0.3:
glispa02(fostopr)$ ldd libsw_api.so
...
libstdc++.so.6 => /usr/sfw/lib/libstdc++.so.6
...
glispa02(fostopr)$ ls -l /usr/sfw/lib/libstdc++.so.6
lrwxrwxrwx 1 root root 18 Jun 21 2010 /usr/sfw/lib/libstdc++.so.6 -> libstdc++.so.6.0.3
但是该库不会导出_ZNKSt9bad_alloc4whatEv,
glispa02(fostopr)$ nm /usr/sfw/lib/libstdc++.so.6 | grep bad_alloc
[7592] | 752340| 64|FUNC |GLOB |0 |2653 |_ZNSt9bad_allocD0Ev
[7324] | 752284| 56|FUNC |GLOB |0 |2652 |_ZNSt9bad_allocD1Ev
[8077] | 752228| 56|FUNC |GLOB |0 |2651 |_ZNSt9bad_allocD2Ev
[7519] | 356736| 76|FUNC |GLOB |0 |473 |_ZSt17__throw_bad_allocv
[7341] | 983588| 12|OBJT |WEAK |0 |3842 |_ZTISt9bad_alloc
[6569] | 777008| 13|OBJT |WEAK |0 |3317 |_ZTSSt9bad_alloc
[7299] | 983568| 20|OBJT |WEAK |0 |3841 |_ZTVSt9bad_alloc
可能是什么问题?错误的版本?我在Unix上用C ++并不是很好,所以我很感激任何帮助。
SPARC32PLUS与SPARC不匹配是否可能导致问题?
glispa02(fostopr)$ file libsw_api.so
libsw_api.so: ELF 32-bit MSB dynamic lib SPARC32PLUS Version 1, V8+ Required, dynamically linked, not stripped
glispa02(fostopr)$ file /usr/sfw/lib/libstdc++.so.6.0.3
/usr/sfw/lib/libstdc++.so.6.0.3: ELF 32-bit MSB dynamic lib SPARC Version 1, dynamically linked, not stripped, no debugging information available
我的系统:
glispa02(fostopr)$ cat /etc/release
Solaris 10 10/09 s10s_u8wos_08a SPARC
Copyright 2009 Sun Microsystems, Inc. All Rights Reserved.
Use is subject to license terms.
Assembled 16 September 2009
glispa02(fostopr)$ uname -a
SunOS glispa02 5.10 Generic_141444-09 sun4u sparc SUNW,SPARC-Enterprise
答案 0 :(得分:2)
您好我也在升级这些文件,我注意到我应该使用分发附带的libstdc ++。so.6.0.9文件而不是/ usr / sfw / lib /
中的文件答案 1 :(得分:1)
如果你在libstdc++.so.6
文件上使用pvs,它会为你提供一堆匹配的条目:GLIBCXX
,如果你没有匹配GLIBCXX_3.4.9
的条目,那么符号bad_alloc::what
不在该库中,即库比从属对象libsw_api.so
如果是这种情况,那么您可能需要更新版本的libstdc ++ - 它会附带更新版本的g ++
答案 2 :(得分:1)
我遇到了同样的问题。
原因是我们导出了错误的LD_LIBRARY_PATH 这样我们的共享库链接到原始gcc的库(3.3)而不是我们的编译器(gcc 4.4)。
修复链接器问题应解决问题