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


102

リンク/コンパイル時に共有オブジェクトを含める定義方法を理解しています。ただし、*.so実行時に実行可能ファイルが共有オブジェクト(ライブラリ)をどのように検索するのか、まだ疑問に思います。

たとえば、私のアプリa.outlib.soライブラリで定義された関数を呼び出します。コンパイル後lib.so、の新しいディレクトリに移動し$HOMEます。

a.outそこに探しに行くと言うことができますか?

回答:


102

共有ライブラリ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


3
いくつかのシステムでは、/lib64および/usr/lib6464ビットのバイナリに使用され、/libそして/usr/lib32ビットバイナリのために使用されます。
マークラカタ

なぜこの正しい答えはldconfigについて何も話さないのですか?
確率が大好き

1
@LovesProbability質問は、実行可能ファイルがライブラリを探す場所に関するものであったため、には関係しませんldconfigldconfigライブラリをインストールするときに関与します。
ジル

1
*.soライブラリの「システム検索パス」はと同じではないことに注意してください$PATH。検索パスは、@ enzotibの回答のとおりです。検索されるパスを印刷するには、を実行しldconfig -v 2>/dev/null | grep -v ^$'\t'ます。
アンドリューベイト

私にとっては、ldconfigを実行/sbin/ldconfigするために、Andrew Bateが他の魔法を使って非ルートで実行する必要がありました
Robert Lugg

16

Linuxでは、動作はld(1)manページで明示されています

       The linker uses the following search paths to locate required
       shared libraries:

       1.  Any directories specified by -rpath-link options.

       2.  Any directories specified by -rpath options.  The difference
           between -rpath and -rpath-link is that directories specified by
           -rpath options are included in the executable and used at
           runtime, whereas the -rpath-link option is only effective at
           link time. Searching -rpath in this way is only supported by
           native linkers and cross linkers which have been configured
           with the --with-sysroot option.

       3.  On an ELF system, for native linkers, if the -rpath and
           -rpath-link options were not used, search the contents of the
           environment variable "LD_RUN_PATH".

       4.  On SunOS, if the -rpath option was not used, search any
           directories specified using -L options.

       5.  For a native linker, the search the contents of the environment
           variable "LD_LIBRARY_PATH".

       6.  For a native ELF linker, the directories in "DT_RUNPATH" or
           "DT_RPATH" of a shared library are searched for shared
           libraries needed by it. The "DT_RPATH" entries are ignored if
           "DT_RUNPATH" entries exist.

       7.  The default directories, normally /lib and /usr/lib.

       8.  For a native linker on an ELF system, if the file
           /etc/ld.so.conf exists, the list of directories found in that
           file.

       If the required shared library is not found, the linker will issue
       a warning and continue with the link.

1
「デフォルトのディレクトリ、通常は/ libおよび/ usr / lib。」->システムが正常であるかどうかを確認するにはどうすればよいですか?
トールステンスターク14

2
問題は実行時間に関するものであり、リンク時間ではありません
-Talespin_Kit

2

ここでの答えは確かだと思うldconfig

ldconfigは、コマンドラインで指定されたディレクトリ、ファイル/etc/ld.so.conf、および信頼できるディレクトリ(/ libおよび/ usr / lib)で見つかった最新の共有ライブラリへの必要なリンクとキャッシュを作成します。キャッシュは、実行時リンカーld.soまたはld-linux.soによって使用されます。ldconfigは、どのバージョンでリンクを更新する必要があるかを判断するときに、遭遇するライブラリのヘッダーとファイル名をチェックします。

http://linux.die.net/man/8/ldconfig


0

アプリケーションを実行するために、ファイルに/proc/1234/mapsは実際に動的にリンクされたすべてのライブラリが含まれます。

1234実行中の実行可能ファイルのpidはどこにありますか。

Gillesの回答で指摘されているように、LinuxはLD_LIBRARY_PATHおよびその他の変数に従います。


4
2番目の文で、Gillesの回答が役立つことを確認してください。ただし、最初の部分は、ファイルがどこにあるかをa.outに伝える方法の説明にはまったく貢献していません。全体として、これは単なるコメントであり、回答ではありません。
アントン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.