Solaris sparc 9/10 libstdc++兼容性问题(64 位)
我在 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 中的 mangled-name 符号的差异和 sparc10...“ExSt12”v/s“ElSt12”。
同样,如果我在 sparc10 上构建 myapi.so,它在 sparc9 上会失败,因为 V9 和 V10 中的符号不匹配。
有人可以指出我是否遗漏了什么有用的提示吗?或者我需要在 V9 上安装任何软件包吗?我假设基于 V9 构建的共享对象应该可以在 V10 上工作。
我想补充一点,V9 上的 libstdc++.so.6 的大小与 V10 不同。 V9 具有 SMCgcc,V10 具有 SUNWgccruntime 和 SMCgcc。
I have gcc 3.4.6 installed on sparc9 and sparc10 systems. I am having incompatibility issues when I try to use shared object(built on sparc9) on sparc10. I am not seeing any issue if I use same shared object on sparc9 system. Snippet from 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
Now following in 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)
I have skipped other dependencies in above output which appear normal.
Then, I ran "nm" against libstdc++.so.6 in /usr/local/lib/sparcv9 for above unreferenced symbol and came with following conclusion:-
V9---> _ZNSt15basic_streambufIcSt11char_traitsIcEE7seekoffExSt12_Ios_SeekdirSt13_Ios_Openmode
V10--->_ZNSt15basic_streambufIcSt11char_traitsIcEE7seekoffElSt12_Ios_SeekdirSt13_Ios_Openmode
If you look carefully, you can see a difference in mangled-name symbol in sparc9 and sparc10... "ExSt12" v/s "ElSt12".
Similarly, if I build myapi.so on sparc10, it fails on sparc9 because of symbol mismatch in V9 and V10.
Can someone please point me to any helpful hints as to if I am missing something? Or do I need to install any package on V9. I am assuming that shared object built on V9 should work on V10.
I would like to add that there is a size of libstdc++.so.6 on V9 is different from V10. V9 has SMCgcc and V10 has both SUNWgccruntime and SMCgcc.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
这些符号分解为:
并且
请注意,一个使用
long
,另一个使用long long
我怀疑这意味着一个是使用 64 位文件偏移量构建的(也称为大文件支持)另一个则不然。这意味着 GCC 的两个版本的构建方式不同(由 sunfreeware.com 或提供它们的任何人构建)并且不兼容。
Those symbols demangle as:
and
Notice that one uses
long
and the other useslong long
I suspect that means one was built with 64-bit file offsets (aka large file support) and the other wasn't. That means the two versions of GCC have been built differently (by sunfreeware.com or whoever provided them) and are incompatible.
看起来您正在使用不兼容版本的 GNU C++ 编译器和两个操作系统上的标准库。不幸的是,C++ 没有标准的 ABI,并且许多编译器在主要版本之间更改了不兼容的符号修改约定(例如 Sun C++ 编译器 4.x 与 5.x,或 g++ 2.x 与 3.x 与 4.x) )。
/usr/local/lib 路径意味着您正在使用从 sunfreeware.com 站点下载的 SMCgcc 软件包中的库- 确保 Solaris 9 和 10 计算机上有匹配的版本。 (没有“sparc 10”,所以您指的是 Solaris 10。)
Looks like you're using incompatible versions of the GNU C++ compiler & standard library on the two OS'es. Unfortunately, there is no standard ABI for C++ and many compilers change symbol mangling conventions incompatibly between major releases (such as Sun C++ compiler 4.x vs. 5.x, or g++ 2.x vs. 3.x vs. 4.x).
The /usr/local/lib path implies you're using the libraries from the SMCgcc packages downloaded from the sunfreeware.com site - make sure you have matching versions on the Solaris 9 and 10 machines. (There is no "sparc 10", so you must mean Solaris 10.)