Linux プログラムが本来のライブラリにリンクしていないと思わせるエラーが発生します。リンクされたすべてのライブラリへのフルパスを取得するにはどうすればよいですか? 名前が表示されることはわかっldd
ていますが、それを使用して完全なパスを取得するにはどうすればよいですか?
ありがとう。
Linux プログラムが本来のライブラリにリンクしていないと思わせるエラーが発生します。リンクされたすべてのライブラリへのフルパスを取得するにはどうすればよいですか? 名前が表示されることはわかっldd
ていますが、それを使用して完全なパスを取得するにはどうすればよいですか?
ありがとう。
実際ldd
には、アプリケーションの共有ライブラリの依存関係から見つけられるファイル名の絶対パスを提供します。
$ ldd v8test
linux-gate.so.1 => (0xb78b2000)
libz.so.1 => /usr/lib/libz.so.1 (0xb787e000)
librt.so.1 => /lib/i686/cmov/librt.so.1 (0xb7875000)
libcppunit-1.12.so.1 => /usr/lib/libcppunit-1.12.so.1 (0xb782c000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0xb7604000)
libm.so.6 => /lib/i686/cmov/libm.so.6 (0xb75dd000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb75bf000)
libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb7478000)
libpthread.so.0 => /lib/i686/cmov/libpthread.so.0 (0xb745f000)
libboost_system-mt.so.1.38.0 => /usr/lib/libboost_system-mt.so.1.38.0 (0xb745b000)
/lib/ld-linux.so.2 (0xb78b3000)
libdl.so.2 => /lib/i686/cmov/libdl.so.2 (0xb7456000)
libboost_thread-mt.so.1.38.0 => /usr/lib/libboost_thread-mt.so.1.38.0 (0xb7383000)
libboost_filesystem-mt.so.1.38.0 => /usr/lib/libboost_filesystem-mt.so.1.38.0 (0xb7370000)
libtinyxml.so.1 => /home/dmitry/tinyxml/libtinyxml.so.1 (0xb7359000)
libboost_regex-mt.so.1.38.0 => /usr/lib/libboost_regex-mt.so.1.38.0 (0xb728c000)
libmysqlclient_r.so.15 => /usr/lib/libmysqlclient_r.so.15 (0xb70a1000)
libicuuc.so.42 => /usr/lib/libicuuc.so.42 (0xb6f61000)
libicudata.so.42 => /usr/lib/libicudata.so.42 (0xb601a000)
libicui18n.so.42 => /usr/lib/libicui18n.so.42 (0xb5e6b000)
libcrypt.so.1 => /lib/i686/cmov/libcrypt.so.1 (0xb5e39000)
libnsl.so.1 => /lib/i686/cmov/libnsl.so.1 (0xb5e22000)
/etc/ld.so.conf
ライブラリは、 に記載されているパスの soname (例: libboost_filesystem-mt.so.1.38.0) で検索されるか、バイナリ自体でLD_LIBRARY_PATH
設定されます。rpath
ldd
何かが見つからない場合は、次のようになります
libicuuc.so.42 => not found
この場合、前述の方法のいずれかを使用して正しい検索パスを指定することを検討してください。
ldd
何らかの理由でライブラリを読み込めない場合に警告します。
$ ldd v8test
./v8test: error while loading shared libraries: /home/dmitry/a/liba.so.2: invalid ELF header
もちろん、ライブラリ自体のエラーから保護することはできません。実際、アプリケーションがライブラリ A と B に依存している可能性があります。どちらも一部のライブラリ C の互換性のないバージョンに依存しています。この状況では、プログラムがクラッシュする可能性が高くなります (ライブラリ C にシンボルのバージョン管理がない場合を除く) - ldd はありません警告が表示されますが、出力で確認できるはずです。
Program-Library-HOWTOが役に立ちます。
ldd
またはdynamic linkerのいくつかのオプションも確認してください。