リンク/コンパイル時に埋め込まれた共有オブジェクトを定義する方法を理解します。しかし、実行可能*.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
。