0

我在 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 中的名称符号不同...“ExSt12”与“ElSt12”。

同样,如果我在 sparc10 上构建 myapi.so,由于 V9 和 V10 中的符号不​​匹配,它会在 sparc9 上失败。

有人可以指出我是否遗漏了什么有用的提示吗?或者我需要在 V9 上安装任何软件包吗?我假设基于 V9 构建的共享对象应该可以在 V10 上运行。

我想补充一点,V9 上的 libstdc++.so.6 的大小与 V10 不同。V9 具有 SMCgcc,V10 具有 SUNWgccruntime 和 SMCgcc。

4

2 回答 2

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 或提供它们的任何人)并且不兼容。

于 2013-09-20T15:41:04.330 回答
0

看起来您在两个操作系统上使用了不兼容版本的 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。)

于 2011-08-04T03:57:44.310 回答