我在sparc9和sparc10系统上安装了gcc 3.4.6。当我尝试在sparc10上使用共享对象(基于sparc9构建)时,我遇到了不兼容问题。如果我在sparc9系统上使用相同的共享对象,我没有看到任何问题。来自makefile的片段: -
LIB=-L/usr/lib/sparcv9 -L/usr/local/lib/sparcv9 -L/lib/sparcv9
gcc -m64 -shared -fPIC -o myapi.so.1 myapi.o $(LIB) -lc -lstdc++ -luuid
现在关注sparc10: -
ldd -d /home/myapi.so
libstdc++.so.6 => /usr/local/lib/sparcv9/libstdc++.so.6
symbol not found: _ZNSt15basic_streambufIcSt11char_traitsIcEE7seekoffExSt12_Ios_SeekdirSt13_Ios_Openmode (./myapi.so)
我在上面的输出中跳过了其他依赖项,看似正常。
然后,我在/ usr / local / lib / sparcv9中对libstdc ++。so.6运行“nm”以获取上述未引用的符号,并得出以下结论: -
V9---> _ZNSt15basic_streambufIcSt11char_traitsIcEE7seekoffExSt12_Ios_SeekdirSt13_Ios_Openmode
V10--->_ZNSt15basic_streambufIcSt11char_traitsIcEE7seekoffElSt12_Ios_SeekdirSt13_Ios_Openmode
如果仔细观察,可以看到sparc9和sparc10中的mangled-name符号有所不同......“ExSt12”v / s“ElSt12”。
同样,如果我在sparc10上构建myapi.so,由于V9和V10中的符号不匹配,它在sparc9上失败。
有人可以指出我是否有任何有用的提示,如果我遗失了什么?或者我需要在V9上安装任何软件包。我假设在V9上构建的共享对象应该在V10上运行。
我想补充一点,libstdc ++的大小.V9上的so.6与V10不同。 V9有SMCgcc,V10有SUNWgccruntime和SMCgcc。
答案 0 :(得分:1)
这些符号取消为:
std::basic_streambuf<char, std::char_traits<char> >::seekoff(long long, std::_Ios_Seekdir, std::_Ios_Openmode)
和
std::basic_streambuf<char, std::char_traits<char> >::seekoff(long, std::_Ios_Seekdir, std::_Ios_Openmode)
请注意,其中一个使用long
,另一个使用long long
我怀疑这意味着一个是使用64位文件偏移(又名大文件支持)构建的,而另一个则不是。这意味着GCC的两个版本的构建方式不同(由sunfreeware.com或任何提供它们的人)并且不兼容。
答案 1 :(得分:0)
看起来你正在使用不兼容的GNU C ++编译器和版本。两个操作系统上的标准库。不幸的是,C ++没有标准的ABI,许多编译器改变了主要版本之间不兼容的符号修改约定(例如Sun C ++编译器4.x与5.x,或g ++ 2.x与3.x vs. 4.x )。
/ usr / local / lib路径意味着您正在使用从sunfreeware.com站点下载的SMCgcc软件包中的库 - 确保您在Solaris 9和10计算机上具有匹配的版本。 (没有“sparc 10”,所以你必须指Solaris 10。)