実行ファイルは、実行時に共有オブジェクトをどこで見つけますか?

実行ファイルは、実行時に共有オブジェクトをどこで見つけますか?

リンク/コンパイル時に埋め込まれた共有オブジェクトを定義する方法を理解します。しかし、実行可能*.soファイルが実行されたときに共有オブジェクト(ライブラリ)をどのように見つけるかはまだ知りたいです。

たとえば、私のアプリケーションはa.outライブラリで定義されている関数を呼び出しますlib.so。コンパイルlib.so$HOME

a.outどこで見つけることができるのかどうすればわかりますか?

答え1

これ共有図書館のご案内関連するほとんどのメカニズムについて説明します。ダイナミックローダーマニュアル詳細については。各UNIXバリアントには独自の方法がありますが、ほとんどは同じ実行可能ファイル形式(非常に低い周波数)そして次のようなものがあります動的リンカー1(ソラリスから)。以下では、Linuxの一般的な動作を要約することに焦点を当てます。全体像については、システムのマニュアルを確認してください。

(用語解説:共有ライブラリをロードするシステム部分はしばしば「ダイナミックリンカ」と呼ばれますが、時には「ダイナミックローダ」とより正確に呼ばれます。動的ローダープログラムまたはコンパイル時ツールとランタイムローダーの組み合わせです。この回答では、「リンカー」はランタイム部分を表します。

簡単に言えば、.soリンカは動的ライブラリ(ファイル)を見つけるときに次のことを試みます。

  • 環境変数にリストされているディレクトリLD_LIBRARY_PATH( DYLD_LIBRARY_PATHOSXの場合)
  • 実行可能ファイルにリストされているディレクトリ;
  • (少なくともLinuxでは)/etc/ld.so.confプラスと/libのエントリで構成されるシステム検索パスのディレクトリ/usr/lib

rpathは実行可能ファイルに保存されます(動的属性ですDT_RPATHDT_RUNPATH。これには、$ORIGIN実行可能ファイルの場所への相対パスを示すために絶対パスまたはで始まるパスを含めることができます。たとえば、実行可能ファイルがにあり、対応する/opt/myapp/binrpathがある場合、$ORIGIN/../lib:$ORIGIN/../plugins動的リンカーはと/opt/myapp/libを検索します/opt/myapp/plugins。 rpathは通常、実行可能ファイルをコンパイルするときにオプションによって決定されますが、その後使用できます-rpathldchrpath

説明するシナリオでアプリケーションの開発者またはパッケージャであり、それを構造体にインストールする場合は、システムに事前…/binにビルドされたバイナリをインストールする場合は、ライブラリをそのディレクトリに配置します…/lib-rpath='$ORIGIN/../lib'検索パス(/usr/local/libシステム管理者の場合は、パスを追加したディレクトリに入れるか$LD_LIBRARY_PATH)を試してくださいchrpath

答え2

Linuxでは、この動作はld(1)マニュアルページに明確に記載されています。

       The linker uses the following search paths to locate required
       shared libraries:

       1.  Any directories specified by -rpath-link options.

       2.  Any directories specified by -rpath options.  The difference
           between -rpath and -rpath-link is that directories specified by
           -rpath options are included in the executable and used at
           runtime, whereas the -rpath-link option is only effective at
           link time. Searching -rpath in this way is only supported by
           native linkers and cross linkers which have been configured
           with the --with-sysroot option.

       3.  On an ELF system, for native linkers, if the -rpath and
           -rpath-link options were not used, search the contents of the
           environment variable "LD_RUN_PATH".

       4.  On SunOS, if the -rpath option was not used, search any
           directories specified using -L options.

       5.  For a native linker, the search the contents of the environment
           variable "LD_LIBRARY_PATH".

       6.  For a native ELF linker, the directories in "DT_RUNPATH" or
           "DT_RPATH" of a shared library are searched for shared
           libraries needed by it. The "DT_RPATH" entries are ignored if
           "DT_RUNPATH" entries exist.

       7.  The default directories, normally /lib and /usr/lib.

       8.  For a native linker on an ELF system, if the file
           /etc/ld.so.conf exists, the list of directories found in that
           file.

       If the required shared library is not found, the linker will issue
       a warning and continue with the link.

答え3

私はここに答えがあると確信していますldconfig

ldconfigは、コマンドラインで指定されたディレクトリ、ファイル/etc/ld.so.conf、および信頼できるディレクトリ(/libおよび/usr/lib)にある最新の共有ライブラリへの必要なリンクとキャッシュを生成します。このキャッシュは、ランタイムリンカー ld.so または ld-linux.so で使用されます。 ldconfigは、更新する必要があるリンクのバージョンを決定するときに見つかったライブラリのヘッダーとファイル名を解決します。

http://linux.die.net/man/8/ldconfig

答え4

実行中のアプリケーションの場合、このファイルには/proc/1234/maps実際の動的リンクライブラリがすべて含まれています。

1234実行中の実行可能ファイルのpidはどこにありますか?

Gillesが答えで指摘したように、LinuxはLD_LIBRARY_PATHや他の変数を尊重します。

関連情報