リンク/コンパイル時に埋め込まれた共有オブジェクトを定義する方法を理解します。しかし、実行可能*.so
ファイルが実行されたときに共有オブジェクト(ライブラリ)をどのように見つけるかはまだ知りたいです。
たとえば、私のアプリケーションはa.out
ライブラリで定義されている関数を呼び出しますlib.so
。コンパイルlib.so
後$HOME
。
a.out
どこで見つけることができるのかどうすればわかりますか?
答え1
これ共有図書館のご案内関連するほとんどのメカニズムについて説明します。ダイナミックローダーマニュアル詳細については。各UNIXバリアントには独自の方法がありますが、ほとんどは同じ実行可能ファイル形式(非常に低い周波数)そして次のようなものがあります動的リンカー1(ソラリスから)。以下では、Linuxの一般的な動作を要約することに焦点を当てます。全体像については、システムのマニュアルを確認してください。
(用語解説:共有ライブラリをロードするシステム部分はしばしば「ダイナミックリンカ」と呼ばれますが、時には「ダイナミックローダ」とより正確に呼ばれます。動的ローダープログラムまたはコンパイル時ツールとランタイムローダーの組み合わせです。この回答では、「リンカー」はランタイム部分を表します。
簡単に言えば、.so
リンカは動的ライブラリ(ファイル)を見つけるときに次のことを試みます。
- 環境変数にリストされているディレクトリ
LD_LIBRARY_PATH
(DYLD_LIBRARY_PATH
OSXの場合) - 実行可能ファイルにリストされているディレクトリ道;
- (少なくともLinuxでは)
/etc/ld.so.conf
プラスと/lib
のエントリで構成されるシステム検索パスのディレクトリ/usr/lib
。
rpathは実行可能ファイルに保存されます(動的属性ですDT_RPATH
)DT_RUNPATH
。これには、$ORIGIN
実行可能ファイルの場所への相対パスを示すために絶対パスまたはで始まるパスを含めることができます。たとえば、実行可能ファイルがにあり、対応する/opt/myapp/bin
rpathがある場合、$ORIGIN/../lib:$ORIGIN/../plugins
動的リンカーはと/opt/myapp/lib
を検索します/opt/myapp/plugins
。 rpathは通常、実行可能ファイルをコンパイルするときにオプションによって決定されますが、その後使用できます-rpath
。ld
chrpath
。
説明するシナリオでアプリケーションの開発者またはパッケージャであり、それを構造体にインストールする場合は、システムに事前…/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は、更新する必要があるリンクのバージョンを決定するときに見つかったライブラリのヘッダーとファイル名を解決します。
答え4
実行中のアプリケーションの場合、このファイルには/proc/1234/maps
実際の動的リンクライブラリがすべて含まれています。
1234
実行中の実行可能ファイルのpidはどこにありますか?
Gillesが答えで指摘したように、LinuxはLD_LIBRARY_PATHや他の変数を尊重します。