web-dev-qa-db-ja.com

LD_LIBRARY_PATHのデフォルト値は何ですか?

私の場合、LD_LIBRARY_PATHが空の文字列に設定されているようです。しかし、すべての標準システムツールは引き続き正常に機能します。そのため、ダイナミックリンカーがそのケースをチェックし、そのケースではLD_LIBRARY_PATHのデフォルトを使用すると思います。

そのデフォルト値は何ですか?少なくとも/usr/libが含まれていると思いますが、他に何がありますか?動的リンカーが検索する標準の場所を把握するための体系的な方法はありますか?

この質問は、ダイナミックリンカーが検索するパスとは少し異なります。デフォルト値があると、LD_LIBRARY_PATHの値が指定されている場合はそれが使用され、指定されていない場合はデフォルト値が使用されます。 、LD_LIBRARY_PATHが指定されている場合、デフォルト値は使用されません。

8
Albert

Linuxの通常のダイナミックリンカーは、キャッシュを使用してライブラリを検索します。キャッシュは_/etc/ld.so.cache_に保存され、_/etc/ld.so.conf_で指定されたパスを検索するldconfigによって更新されます(現在、通常は_/etc/ld.so.conf.d_内のファイル)。

したがって、_LD_LIBRARY_PATH_のデフォルト値はありません。デフォルトのライブラリルックアップではまったく必要ありません。 _LD_LIBRARY_PATH_が定義されている場合、それが最初に使用されますが、他のルックアップ(いくつかのデフォルトディレクトリも含む)は無効になりません。

ld.so(8) manpage に詳細があります:

共有オブジェクトの依存関係にスラッシュが含まれていない場合は、次の順序で検索されます。

  • 存在する場合は、バイナリの_DT_RPATH_動的セクション属性で指定されたディレクトリを使用し、_DT_RUNPATH_属性は存在しません。 _DT_RPATH_の使用は非推奨です。

  • 環境変数_LD_LIBRARY_PATH_を使用します。ただし、実行可能ファイルがセキュア実行モード(下記参照)で実行されている場合は無視されます。

  • 存在する場合、バイナリの_DT_RUNPATH_動的セクション属性で指定されたディレクトリを使用します。

  • 拡張ライブラリパスで以前に見つかった候補共有オブジェクトのコンパイル済みリストを含むキャッシュファイル_/etc/ld.so.cache_から。ただし、バイナリが_-z nodeflib_リンカーオプションでリンクされている場合、デフォルトパスの共有オブジェクトはスキップされます。ハードウェア機能ディレクトリ(以下を参照)にインストールされた共有オブジェクトは、他の共有オブジェクトよりも優先されます。

  • デフォルトのパスでは_/lib_、次に_/usr/lib_。 (一部の64ビットアーキテクチャでは、64ビット共有オブジェクトのデフォルトパスは_/lib64_、次に_/usr/lib64_です。)バイナリが_-z nodeflib_リンカーオプションでリンクされている場合、この手順スキップされます。

_LD_LIBRARY_PATH_が空の場合、それは 無視されます です。空に設定されている場合values(たとえば、_LD_LIBRARY_PATH=:_を使用)、これらの空の値は 現在のディレクトリとして解釈されます

21
Stephen Kitt