システムは動的ライブラリをどこで検索しますか? [コピー]

システムは動的ライブラリをどこで検索しますか? [コピー]

システムが動的ライブラリを検索する場所を知りたいです。 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

ライブラリパスはバイナリにハードコードできます。

~からRPATH ウィキペディアページ

GNU Cライブラリの動的リンカーとその派生物である組み込みGLIBCは、高度に高度な共有ライブラリ検索アルゴリズムを実装しています。デフォルトの検索順序は次のとおりです。

  1. バイナリファイルのDT_RPATH動的セクション属性にある(コロンで区切られた)パス(存在する場合)。 DT_RUNPATH 属性は存在しません。
  2. 実行可能ファイルが setuid/setgid バイナリでない場合の環境変数 LD_LIBRARY_PATH の (コロンで区切られた) パス。この場合は無視されます。 --library-path オプション (/lib/ld-linux.so.2 --library-path $HOME/mylibs myprogram など) を使用して動的リンカーを呼び出して LD_LIBRARY_PATH をオーバーライドできます。
  3. バイナリファイルのDT_RUNPATH動的セクション属性にある(コロンで区切られた)パス(存在する場合)。
  4. 照会は、拡張ライブラリー・パス (/etc/ld.so.conf によって設定されます) で以前に見つかった候補ライブラリーのコンパイル済みリストを含む ldconfig キャッシュ・ファイル (通常は /etc/ld.so.cache にあります)に基づいています。 。ただし、-z nodeflibリンカオプションを使用してバイナリをリンクすると、デフォルトのライブラリパスのライブラリをスキップします。
  5. 信頼できるデフォルトパスは/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

関連情報