リンク/コンパイル時にインクルード共有オブジェクトを定義する方法を理解しています。ただし、実行可能ファイルは共有オブジェクト(*.so
)をどのように検索するのでしょうか。 ライブラリ)実行時。
たとえば、私のアプリはa.out
lib.so
で定義された関数を呼び出します 図書館。コンパイル後、lib.so
を移動します $HOME
の新しいディレクトリに移動します 。
a.out
はどうすればわかりますか そこで探しに行きますか?
承認された回答:
共有ライブラリHOWTOは、関連するメカニズムのほとんどを説明し、ダイナミックローダーのマニュアルでさらに詳しく説明します。 UNIXの各バリアントには独自の方法がありますが、ほとんどの場合、同じ実行可能形式(ELF)を使用し、同様の動的リンカー¹(Solarisから派生)を備えています。以下に、Linuxに焦点を当てた一般的な動作を要約します。完全なストーリーについては、システムのマニュアルを確認してください。
(用語注:共有ライブラリをロードするシステムの部分は、「ダイナミックリンカー」と呼ばれることがよくありますが、より正確には「ダイナミックローダー」と呼ばれることもあります。「ダイナミックリンカー」は、コンパイル時にダイナミックローダーの命令を生成するツールを意味する場合もあります。プログラム、またはコンパイル時ツールとランタイムローダーの組み合わせ。この回答では、「リンカー」はランタイム部分を指します。)
一言で言えば、ダイナミックライブラリ(.so
ファイル)リンカーは次のことを試みます:
-
LD_LIBRARY_PATH
にリストされているディレクトリ 環境変数(DYLD_LIBRARY_PATH
OSXの場合); - 実行可能ファイルのrpathにリストされているディレクトリ;
- システム検索パス上のディレクトリ。これは(少なくとも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
を試してください 。