2

Linux では、同じマシン上に A と B の 2 つのバイナリをビルドしました。少し古い libstdc++ がインストールされた別のマシンに移動します。バイナリ AI で ldd -v を実行すると、次のようになります。

libstdc++.so.6 (CXXABI_1.3) => /usr/lib64/libstdc++.so.6
libstdc++.so.6 (GLIBCXX_3.4) => /usr/lib64/libstdc++.so.6

バイナリ BI で ldd -v を実行すると、次のようになります。

libstdc++.so.6 (CXXABI_1.3) => /usr/lib64/libstdc++.so.6
libstdc++.so.6 (GLIBCXX_3.4.15) => not found
libstdc++.so.6 (GLIBCXX_3.4) => /usr/lib64/libstdc++.so.6

GLIBCXX_3.4.15 の依存関係が見つからないことに注意してください。インストールされた libstdc++ は GLIBCXX_3.4.10 までしかサポートしていないため、これは理にかなっています。

問題は、バイナリ B が GLIBCXX_3.4.15 に依存していると ldd が判断するメカニズムは何ですか? さらに重要なのは、この依存関係を引き起こしているコードを特定するにはどうすればよいですか?

4

1 に答える 1

2

実行可能ファイルで実行するnmと、多数のシンボルが表示されますが、そのうちのいくつかは未定義です (これらは、最初の列が空白で、のデフォルト出力のU2 番目の列にがあるため、わかります)。nm

これらの記号の一部には@@whatever接尾辞が付いています。これらの接尾辞は、これらのシンボルのバージョン依存関係であり、バイナリ B を探すと、@@GLIBCXX_3.4.15どの特定のシンボルがそのバージョン依存関係を引き起こしているかがわかります。

于 2012-02-29T01:15:36.317 に答える