回答:
共有ライブラリHOWTOは、関与するメカニズムのほとんどを説明し、ダイナミックローダーのマニュアルをより詳細になります。各UNIXバリアントには独自の方法がありますが、ほとんどは同じ実行可能形式(ELF)を使用し、同様の動的リンカー(Solarisから派生)を使用します。以下に、Linuxを中心とした一般的な動作をまとめます。完全なストーリーについては、システムのマニュアルを確認してください。
簡単に言うと、動的ライブラリ(.so
ファイル)を探しているとき、リンカーは次のことを試みます。
LD_LIBRARY_PATH
環境変数にリストされているディレクトリ(DYLD_LIBRARY_PATH
OSX上);/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
。
ldconfig
。ldconfig
ライブラリをインストールするときに関与します。
*.so
ライブラリの「システム検索パス」はと同じではないことに注意してください$PATH
。検索パスは、@ enzotibの回答のとおりです。検索されるパスを印刷するには、を実行しldconfig -v 2>/dev/null | grep -v ^$'\t'
ます。
/sbin/ldconfig
するために、Andrew Bateが他の魔法を使って非ルートで実行する必要がありました
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.
ここでの答えは確かだと思うldconfig
。
ldconfigは、コマンドラインで指定されたディレクトリ、ファイル/etc/ld.so.conf、および信頼できるディレクトリ(/ libおよび/ usr / lib)で見つかった最新の共有ライブラリへの必要なリンクとキャッシュを作成します。キャッシュは、実行時リンカーld.soまたはld-linux.soによって使用されます。ldconfigは、どのバージョンでリンクを更新する必要があるかを判断するときに、遭遇するライブラリのヘッダーとファイル名をチェックします。
アプリケーションを実行するために、ファイルに/proc/1234/maps
は実際に動的にリンクされたすべてのライブラリが含まれます。
1234
実行中の実行可能ファイルのpidはどこにありますか。
Gillesの回答で指摘されているように、LinuxはLD_LIBRARY_PATHおよびその他の変数に従います。
/lib64
および/usr/lib64
64ビットのバイナリに使用され、/lib
そして/usr/lib
32ビットバイナリのために使用されます。