GNU/Linux >> Linux の 問題 >  >> Linux

実行可能ファイルは実行時に共有オブジェクトをどこで検索しますか?

リンク/コンパイル時にインクルード共有オブジェクトを定義する方法を理解しています。ただし、実行可能ファイルは共有オブジェクト(*.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を試してください 。


Linux
  1. Linuxですべてのユーザーの共有ディレクトリを作成する方法

  2. アプリケーションの終了コードを検索する方法は?

  3. Linux –サーバー上の共有ディレクトリのアクセス許可の問題?

  1. カスタムコマンドの動的Zshオートコンプリート?

  2. Ubuntuリポジトリからパッケージを削除する理由はどこにありますか?

  3. クラウドホスティングプロバイダーで何を探すべきか

  1. Linux 上の C++ 動的共有ライブラリ

  2. 共有メモリの一貫性のためのロック メカニズム

  3. LinuxでEclipseはeclipse.iniをどこで探しますか