solaris sparc 9/10 libstdc ++兼容性问题(64位)

时间:2011-08-04 01:56:42

标签: solaris sparc libstdc++

我在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。

2 个答案:

答案 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。)