コマンドは、共有ライブラリを探すディレクトリを一覧表示しますか?

コマンドは、共有ライブラリを探すディレクトリを一覧表示しますか?

私は読んだwhich共有ライブラリと同じそして実行可能ファイルの実行時に共有オブジェクトを探す場所はどこですか?、しかしすべてのディレクトリを一覧表示するコマンドはありますか?共有ライブラリはどこで検索されますか?

2番目の質問で説明したすべてのリストを自動的に計算するコマンドに似ています。

答え1

短い:なし

long:関連する環境変数は、システムと構成によって異なります。特定のシステム/構成に対してこれを行うスクリプトを作成できます。

実行可能ファイルの実行時に共有オブジェクトを探す場所はどこですか?少し洞察力を提供しますが、不完全です。 OSXとSolarisに言及していますが、Linuxに焦点を当てて、次の2つのリソースを指しています。

次の点も役に立ちます。

特に、「sudo ldconfig -v

-v--verbose
詳細モード。現在のバージョン番号、スキャンされた各ディレクトリの名前、および生成されたすべてのリンクを印刷します。自動モードをオーバーライドします。

これは閉鎖質問に答えるが関係のない情報をたくさん提供します。 (BSDがこれを使用している間、ほとんどはLinuxに限定されていますが異なります。マニュアルページをご覧ください)。出力形式についていくつかの仮定を行うと、次のように出力形式からディレクトリをインポートできます。

sudo ldconfig -v 2>/dev/null | grep ':$' |sed -e 's/://'

(一つのシステムで)

/usr/local/lib
/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu
/lib
/usr/lib

要約すると:なし注文するただし、システムによって異なるスクリプトを作成できます。

答え2

GNUシステムでは

ldconfig -p | tail -n +2 | grep -o '/.*/' | sort -u

キャッシュに動的ライブラリがあるディレクトリを提供します。これをに追加できます$LD_LIBRARY_PATH。ここで構文は次zshのとおりです。

(
  ldconfig -p | tail -n +2 | grep -o '/.*/'
  [ -n "$LD_LIBRARY_PATH" ] && printf '%s/\n' ${${(s/:/)LD_LIBRARY_PATH}:A}
) | sort -u

また、少なくとも私のx86_64 GNUシステムは、64ビット実行可能ファイルの場合$dir/x86_64と各ディレクトリからも$dir/tls検索します$dir/tls/x86_64

また、実行可能ファイルにはハードコードされたライブラリパスが含まれている場合があります。それでもGNUダイナミックリンカーを使用すると、LD_DEBUG=libs次の方法を使用して検索パスを取得できます(ここは私のGNU / Linuxシステムで実行可能な64ビットELFです)。

$ LD_DEBUG=libs /lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 --inhibit-cache /bin/true 2>&1 |
   sed '/.*search path=/!d;s///;s/[[:blank:]]*([^)]*)$//' |
   tr : '\n' |
   sort -u
/home/stephane/lib
/home/stephane/lib/tls
/home/stephane/lib/tls/x86_64
/home/stephane/lib/x86_64
/lib
/lib/tls
/lib/tls/x86_64
/lib/x86_64
/lib/x86_64-linux-gnu
/lib/x86_64-linux-gnu/tls
/lib/x86_64-linux-gnu/tls/x86_64
/lib/x86_64-linux-gnu/x86_64
/usr/lib
/usr/lib/tls
/usr/lib/tls/x86_64
/usr/lib/x86_64
/usr/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu/tls
/usr/lib/x86_64-linux-gnu/tls/x86_64
/usr/lib/x86_64-linux-gnu/x86_64

答え3

そんな命令があるとは知らなかったですね。しかし、/etc/ld.so.confおそらくすべてのファイル/etc/ld.so.conf.d/とその中で見つけたすべてが$LD_LIBRARY_PATHあなたの質問に対する答えを提供します。共有ライブラリはどこで検索できますか?

注:実行可能ファイルは追加または代替検索パスを定義できます。

また、lddすべてのファイルの検索パスを使用して、動的リンカーが実際に検索する場所を確認することもできます。次の方法は時間がかかり、確かに賞を受賞できません。

ldd /bin/* /usr/bin/* /sbin/* /usr/sbin/* 2>/dev/null | grep '=>' | awk '{print $3;}' | xargs dirname | sort -u

答え4

すべての共有ライブラリを一覧表示する特定のコマンドがわかりませんが、以下を実行して「あいまいな」回避策を使用できます。

which <non-existent command/alias>

たとえば、次のように出力を確認します。

[$]› which fake-command
/usr/bin/which: no fake-command in (/usr/local/sbin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin)

または* binで終わるディレクトリを見つけます。

find / -name *bin -type d 

ただし、これは共有ライブラリにない結果が多すぎる可能性があります。

関連情報