私は読んだwhich
共有ライブラリと同じそして実行可能ファイルの実行時に共有オブジェクトを探す場所はどこですか?、しかしすべてのディレクトリを一覧表示するコマンドはありますか?共有ライブラリはどこで検索されますか?
2番目の質問で説明したすべてのリストを自動的に計算するコマンドに似ています。
答え1
短い:なし
long:関連する環境変数は、システムと構成によって異なります。特定のシステム/構成に対してこれを行うスクリプトを作成できます。
実行可能ファイルの実行時に共有オブジェクトを探す場所はどこですか?少し洞察力を提供しますが、不完全です。 OSXとSolarisに言及していますが、Linuxに焦点を当てて、次の2つのリソースを指しています。
- ライブラリ HOWTO: 3. 共有ライブラリ(
LD_LIBRARY_PATH
あまり一般的ではないものは言及されていますが、言及されておらず、LD_LIBRARY_PATH_64
また1行として言及されています。道)。 - ld.so、ld-linux.so* - 動的リンカー/ローダー、再びいくつかの環境変数に言及し、道。
次の点も役に立ちます。
- ldconfig - ダイナミックリンカランタイムバインディングの設定、Linux固有(OSXまたはSolarisではない):
ldconfig
コマンドラインで指定されたディレクトリにある最新の共有ライブラリへの必要なリンクとキャッシュをファイルに生成します。/etc/ld.so.conf
と信頼できるディレクトリから/lib
そして/usr/lib
(x86-64、lib、および/usr/lib
32ビットライブラリの信頼できるディレクトリ。/lib64
そして/usr/lib64
64ビットライブラリの場合)。 - 共有ライブラリは64ビット/ 32ビット混合システムでどのように機能しますか?
- shlibスクリプト、共有ライブラリの場所を指定するために使用されるさまざまな環境変数を一覧表示するncursesのユーティリティスクリプトです。
特に、「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
ただし、これは共有ライブラリにない結果が多すぎる可能性があります。