特定の共有ライブラリのコードで使用されている関数/変数の検索

特定の共有ライブラリのコードで使用されている関数/変数の検索

私はLinuxプラットフォーム(redhat)で大規模なC ++プロジェクト、特にここで使用されている共有ライブラリを分析しています。特定の共有ライブラリで、このプロジェクトで使用されているシンボル(関数/変数)をどのように見つけることができますか?

まず、バイナリで次のコマンドを実行します。

readelf -d binaryName | grep -i "Shared library"

私のプロジェクトで使用されている共有ライブラリのリストを入手しました。 (これらの共有ライブラリにも独自の依存関係があるため、lddはより長いリストを表示します。)

 0x0000000000000001 (NEEDED)             Shared library: [librt.so.1]
 0x0000000000000001 (NEEDED)             Shared library: [libpthread.so.0]
 0x0000000000000001 (NEEDED)             Shared library: [libuv.so.1]
 0x0000000000000001 (NEEDED)             Shared library: [libssl.so.1.1]
 0x0000000000000001 (NEEDED)             Shared library: [libcrypto.so.1.1]
 0x0000000000000001 (NEEDED)             Shared library: [libz.so.1]
 0x0000000000000001 (NEEDED)             Shared library: [libstdc++.so.6]
 0x0000000000000001 (NEEDED)             Shared library: [libm.so.6]
 0x0000000000000001 (NEEDED)             Shared library: [libgcc_s.so.1]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]

libuv.so.1これで、プロジェクトのコードベースで使用されているシンボルを見つける方法があります。誰でもロードマップを提案できますか?

ベストアンサー1

nm -uD /path/to/your/binary

バイナリの未定義のすべての動的シンボルがリストされます。その後、出力と一致させる必要があります。

nm -gD /path/to/a/library

リストされた各ライブラリーに対して、コマンドはreadelf各シンボルを提供するライブラリーを決定します。

これが必ずしも完全な写真を提供するわけではありません。特に、を通じてアクセスされるライブラリとシンボルはlibdl考慮されません。やる意思があれば走るこれはバイナリであり、GNU Cライブラリの動的ローダ(ld.soまたはLinuxでは)を使用しているため、ld-linux.so環境でsetを使用してバイナリを実行してすべてのシンボルバインディングを詳細に表示できます。詳細よりLD_DEBUG=bindingsman ld.so

おすすめ記事