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