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

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

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

おすすめ記事