0

sparc9 および sparc10 システムに gcc 3.4.6 をインストールしました。sparc10 で共有オブジェクト (sparc9 でビルド) を使用しようとすると、非互換性の問題が発生します。sparc9 システムで同じ共有オブジェクトを使用しても問題はありません。メイクファイルからのスニペット:-

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" v/s "ElSt12"。

同様に、sparc10 で myapi.so をビルドすると、V9 と V10 のシンボルの不一致が原因で、sparc9 で失敗します。

私が何かを見逃しているかどうかについて、誰かが私に役立つヒントを教えてもらえますか? または、V9 にパッケージをインストールする必要がありますか。V9 で構築された共有オブジェクトは V10 で動作するはずです。

V9 の libstdc++.so.6 のサイズが V10 と異なることを付け加えておきます。V9 には SMCgcc があり、V10 には SUNWgccruntime と SMCgcc の両方があります。

4

2 に答える 2

0

2 つの OS で互換性のないバージョンの 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 に答える