システムが動的ライブラリを検索する場所を知りたいです。 nxclientを例に挙げましょう。たとえば、ldd /usr/NX/bin/nxclientは私にいくつかの出力を与えました。
libpng12.so.0 => /usr/NX/lib/libpng12.so.0 (0x00007fcb4a16f000)
システムが/usr/lib64/libpng12.so.0の代わりに/usr/NX/lib/libpng12.so.0を選択するのはなぜですか?どちらも存在します。これはどこで構成されていますか? /etc/ld.so.conf*には/usr/NXは含まれておらず、$LD_LIBRARY_PATHは空です。
答え1
ライブラリパスはバイナリにハードコードできます。
GNU Cライブラリの動的リンカーとその派生物である組み込みGLIBCは、高度に高度な共有ライブラリ検索アルゴリズムを実装しています。デフォルトの検索順序は次のとおりです。
- バイナリファイルのDT_RPATH動的セクション属性にある(コロンで区切られた)パス(存在する場合)。 DT_RUNPATH 属性は存在しません。
- 実行可能ファイルが setuid/setgid バイナリでない場合の環境変数 LD_LIBRARY_PATH の (コロンで区切られた) パス。この場合は無視されます。 --library-path オプション (/lib/ld-linux.so.2 --library-path $HOME/mylibs myprogram など) を使用して動的リンカーを呼び出して LD_LIBRARY_PATH をオーバーライドできます。
- バイナリファイルのDT_RUNPATH動的セクション属性にある(コロンで区切られた)パス(存在する場合)。
- 照会は、拡張ライブラリー・パス (/etc/ld.so.conf によって設定されます) で以前に見つかった候補ライブラリーのコンパイル済みリストを含む ldconfig キャッシュ・ファイル (通常は /etc/ld.so.cache にあります)に基づいています。 。ただし、-z nodeflibリンカオプションを使用してバイナリをリンクすると、デフォルトのライブラリパスのライブラリをスキップします。
- 信頼できるデフォルトパスは/libと/usr/libにあります。 -z nodeflibリンカオプションを使用してバイナリがリンクされている場合は、この手順をスキップしてください。
バイナリに RPATH が設定されていることを確認するには、次の手順を実行します。
readelf -d filenameは、「動的」部分のデータのみを表示します。
ヘッダーの「動的」部分には、初期ロード中に使用されたデータが含まれているので興味深いです。たとえば、次のようになります。
NEEDED: libraries needed by this module RPATH: See “Loader search procedure” below SONAME: If this module is a library, this item shows the “soname” of the library.
源泉:Linuxローダーとライブラリを見つける方法:ld-linuxなど
ldconfigキャッシュ内のすべてのライブラリを表示するには、次の手順を実行します。
ldconfig -p
バイナリファイルにRUNPATHを設定する例
$ readelf -d /opt/teamviewer9/tv_bin/TVGuiSlave.64 | grep -i RUNPATH
0x000000000000001d (RUNPATH) Library runpath: [${ORIGIN}/../lib]
答え2
システムは、で指定されたパスから最初に検索し、LD_LIBRARY_PATH
次にで指定されたパスから検索します/etc/ld.so.conf
。