名前 | 形式 | 機能説明 | オプション | 使用法 | ファイル | 属性 | 関連項目 | 診断 | 注意事項
ldd [-d | -r] [-c] [-e envar] [-f] [-i] [-L] [-l] [-s] [-u] [-v] filename...
ldd ユーティリティは、実行可能ファイルまたは共有オブジェクトの動的依存関係を表示します。ldd は実行時リンカー ld.so.1 を使用して診断情報を生成します。実行時リンカーは検査対象のオブジェクトを取得して、実行中のプロセスで使用されるのと同様に処理します。デフォルトでは、すべてのレイジーな依存関係の読み込みを発生します。
filename が実行可能ファイルである場合、ldd は filename の読み込み時に読み込まれるすべての共有オブジェクトのパス名を表示します。
filename が共有オブジェクトである場合、ldd は filename の読み込み時に読み込まれるすべての共有オブジェクトのパス名を表示します。ldd は、検査対象の共有オブジェクトに実行権が与えられているものとみなします。実行権が与えられていない場合、ldd は警告を出力してからファイルを処理します。
ldd はファイルを 1 つずつ入力処理します。入力ファイルごとに、ldd は次のいずれかを実行します。
オブジェクトの依存関係が存在する場合はその依存関係を表示する
依存関係が存在しない場合はそのまま続行する
正常に処理できなかった場合はエラーメッセージを出力する
ldd により検査される動的オブジェクトは実行されません。このため、ldd を実行しても、dlopen(3C) を使って明示的に追加された共有オブジェクトは一切表示されません。プロセスまたはコアファイルにより使用されているオブジェクトをすべて表示するには、pldd(1) を使用します。
ldd は、filename とそこで使用される共有オブジェクト間の互換性を調べることもできます。次のオプションを指定すると、ldd は filename の実行時に発生する未解決のシンボル参照について、警告を出力します。
即時参照をチェックします。
即時参照およびレイジー参照の両方をチェックします。
1 回の ldd 呼び出しでは、上記のオプションのいずれか一方だけしか指定できません。即時参照の対象は通常、実行可能または共有オブジェクトが使用するデータ項目、関数へのポインタ、そして、位置に依存する共有オブジェクトからの関数呼び出しです。レイジー参照は通常、位置に依存しない共有オブジェクトからのグローバル関数の呼び出し、または実行可能ファイルからの外部関数呼び出しです。各参照タイプの詳細は、『リンカーとライブラリ』の「再配置処理の実行に関する説明」を参照してください。オブジェクトの読み込みは、再配置処理の影響も受けます。詳細は「レイジー読み込み」を参照してください。
ldd は依存関係についても確認することができます。次に示す各オプションを使用すると、ldd は、filename が読み込まれたときに、未参照または未使用の依存関係が読み込まれた場合に、それらに対する警告を出力します。1 つのシンボル参照が 1 つの依存関係にバインドされているときのみ、その依存関係が使用されていると考えられます。したがって、これらのオプションはシンボル参照が検査されているときにのみ有用です。-r オプションが有効でない場合、-d が有効になります。
オブジェクトにより定義されているが、オブジェクトからバインドされていない依存関係は、未参照の依存関係です。filename が読み込まれたときにその他のオブジェクトによりバインドされていない依存関係は、未使用のオブジェクトです。
未参照または未使用の依存関係を表示します。未参照の依存関係が、filename で読み込まれた他のオブジェクトによりバインドされていない場合、その依存関係は未使用としても設定されます。巡回の外部にあるオブジェクトにバインドされていない巡回依存関係は、未参照ともみなされます。
未使用のオブジェクトを表示します。
-U は -u の機能をすべて含んでいますが、-U または -u オプションのどちらか 1 つだけを ldd の 1 回の呼び出しの間に指定することができます。-r オプションを使用するとき未参照または未使用であると判明したオブジェクトは、依存関係として削除すべきです。これらのオブジェクトは参照を提供しませんが、filename が読み込まれるとき、不必要なオーバーヘッドを生みます。-d オプションを使用する場合、未参照または未使用と判明したオブジェクトは filename が読み込まれるときにすぐには要求されません。これらのオブジェクトはレイジー読み込みの候補です。詳細は、使用法 の Lazy Loading を参照してください。
未使用の依存関係を取り除くと、実行時リンクのオーバーヘッドを下げることができます。未参照の依存関係を取り除くと、実行時リンクのオーバーヘッドを少し下げることができます。ただし、未参照の依存関係の削除は、異なるオブジェクトと組み合わされたときや、またはその他のオブジェクトの依存関係が変化するにつれ、未使用の依存関係に対して保護されます。
次のオプションを使用できます。
いっさいの構成ファイルの使用を禁止します。構成ファイルは、デフォルトの検索パスの変更、ディレクトリキャッシュの提供、および代替オブジェクト依存関係の提供に利用できます。crle(1) のマニュアルページを参照してください。
環境変数 envar を設定します。
このオプションは、LD_PRELOAD などの、ldd そのものに悪影響を与える可能性のある実行時リンカー環境変数を試す場合に便利です。
このオプションは、LD_DEBUG などの追加情報だけを検査中のオブジェクトから抽出する場合にも役立ちます。ld.so.1(1) と lari(1)を参照してください。
安全でない実行可能ファイルの検査を強制します。スーパーユーザーが呼び出した場合、ldd はデフォルトで、安全でないことが判明した実行可能ファイルをいっさい処理しません。実行可能ファイルは、指定されたインタプリタが /usr/lib または /etc/lib にない場合、あるいは、インタプリタが判別できない場合は、安全でないとみなされます。「セキュリティ」を参照してください。
初期化セクションの実行順序を表示します。表示される順序は、-d または -r オプションの使用によって変わります。「初期化順序」を参照してください。
レイジー読み込みを有効にします。これは、検査対象のオブジェクトをプロセスの一部として読み込む場合のデフォルトの動作モードです。この場合、レイジーオブジェクト内で定義されているシンボルが参照されたときに、レイジーな依存関係またはフィルタだけがプロセスに読み込まれます。-L オプションとともに -d または -r オプションを使用すると、実行プロセスで発生する依存関係および読み込み順序を調べることができます。
あらゆるフィルタを強制的に即時処理します。(すべてのフィルタとその依存関係を表示するため)フィルタの即時処理は現在、ldd のデフォルトの動作モードです。ただし、このデフォルトモードでは、検出されなかった外部フィルタはそのまま無視されます。-l オプションを使用すると、検出されなかった外部フィルタに起因するエラーメッセージが生成されます。
共有オブジェクトの依存関係を調べるのに使用した検索パスを表示します。
filename の処理中に発生したすべての依存関係を表示します。このオプションを指定すると、依存関係が要求するバージョン情報も表示します。pvs(1) のマニュアルページを参照してください。
スーパーユーザーは、検査対象の実行可能ファイルが信頼できると判明している場合に限り、-f オプションを使用します。信頼できない実行可能ファイルに -f オプションを使用すると、システムのセキュリティが損なわれる可能性があります。検査対象の実行ファイルが信頼できるものかどうかが不明な場合、ユーザーユーザーは一時的に一般ユーザーになり、一般ユーザーとして ldd を呼び出す必要があります。
dump(1) および adb(1) の :r サブコマンドを使用しないで、adb(1) を使用することにより、信頼できないオブジェクトを安全に検査できます。また、スーパーユーザー以外のユーザーは adb(1) の :r サブコマンドまたは truss(1) を使用することによって、それほどリスクを冒さずに信頼できない実行可能ファイルを検査できます。信頼できない実行可能ファイルで ldd、adb の :r サブコマンド、または truss を使用する場合は、リスクを最小限に抑えるためにユーザー ID nobody を使用してください。
レイジー読み込みを直接的に適用するには、レイジーな依存関係を指定します ld(1) の -z lazyload オプションを参照)。レイジー読み込みを間接的に適用するには、フィルタを指定します (ld(1) の -f オプションと -F オプションを参照)。レイジー読み込みをオブジェクトに適用する場合、使用するオプションによっては、ldd の出力が異なることがあります。すべての依存関係がレイジーであるとされたオブジェクトの場合、ldd のデフォルトの動作により、すべての依存関係はそのオブジェクトで記録される順に出力されます。
example% ldd main libelf.so.1 => /lib/libelf.so.1 libnsl.so.1 => /lib/libnsl.so.1 libc.so.1 => /lib/libc.so.1 |
実行時にこのオブジェクトを使用した場合の レイジー読み込み動作は、-L オプションを使用することによって有効にできます。このモードの場合、レイジーな依存関係が読み込まれるのは、レイジーオブジェクト内で定義されているシンボルが参照されたときです。したがって、-L オプションを -d および -r オプションと組み合わせて使用すると、即時参照とレイジー参照のそれぞれを満たすのに必要な依存関係を調べることができます。
example% ldd -L main example% ldd -d main libc.so.1 => /lib/libc.so.1 example% ldd -r main libc.so.1 => /lib/libc.so.1 libelf.so.1 =>/lib/libelf.so.1 |
この例の場合、出力される依存関係の順序は、オプションなしで実行した ldd の場合と異なります。また、-r オプションを使用した場合とも異なります。レイジー依存関係に対する参照は、実行中のプログラムと同じ順序では発生しません。
レイジー読み込みを調べると、参照を満たす必要のないオブジェクトも明らかになります。このようなオブジェクト (上記の例では libnsl.so.1) は、検査対象のオブジェクトを作成するために使用したリンク行から削除可能な候補です。
必要な依存関係が明示的に定義されていないオブジェクトでは、使用するオプションによって、ldd によって表示される初期化セクションの順序が異なる場合があります。次に、簡単な適用例を示します。
example% ldd -i main libA.so.1 =>./libA.so.1 libc.so.1 =>/lib/libc.so.1 libB.so.1 =>./libB.so.1 init object=./libB.so.1 init object=./libA.so.1 init object=/lib/libc.so.1 |
再配置が適用されると、初期化セクションの順序は次のようになります。
example% ldd -ir main ......... init object=/lib/libc.so.1 init object=./libB.so.1 init object=./libA.so.1 |
この場合、libB.so.1 は /usr/lib/libc.so.1 の関数を参照します。ただし、このライブラリに明示的な依存関係はありません。再配置が検出されてはじめて、依存関係が確立され、その結果、この暗黙的な依存関係により初期化セクションのソート順序が影響を受けます。
通常、アプリケーションの実行時に設定される初期化セクションのソート順序は、ldd に -d オプションを指定した場合と同じです。最適な順序が得られるのは、すべてのオブジェクトでそれぞれの依存関係が完全に定義されている場合です。動的オブジェクトの作成が望ましい場合は、ld(1) でオプション -z defs および -z ignore を使用します。
1 つ以上の動的オブジェクトが相互に参照する場合には、循環型依存関係が生じる可能性があります。循環型依存関係は、各依存関係固有のソート順序を確立できないので、避けなければなりません。
オブジェクトファイルを静的に分析する方が望ましい場合は、dump(1) や elfdump(1) などのツールを使用して依存関係を調べることができます。
次の属性については、attributes(5) のマニュアルページを参照してください。
属性タイプ |
属性値 |
---|---|
使用条件 |
SUNWtoo |
crle(1), dump(1), elfdump(1), lari(1), ld(1), ld.so.1(1), mdb(1), pldd(1), pvs(1), truss(1), dlopen(3C), attributes(5)
ldd は共有オブジェクトのパス名の記録を 標準出力に書き込みます。シンボルの解決問題に関する任意選択のリストは、標準エラー出力に書き込まれます。filename が実行可能ファイルまたは共有オブジェクトではない場合、あるいは、読み取り用にオープンできない場合、ゼロ以外の終了ステータスが返されます。
共有オブジェクトで -d または -r オプションを使用すると、誤解を生じるような結果が出力される場合があります。ldd は共有オブジェクトにおける「最悪の場合」の解析を行います。しかし実際には、未解決として報告されたシンボルでも、その一部または全部が共有オブジェクトを参照する実行可能ファイルによって解決されることがあります。実行時リンカーのプリロードメカニズム (LD_PRELOAD) を使用すると、検査対象のオブジェクトに依存関係を追加できます。
ldd は実行時リンカーと同じアルゴリズムを使用して、共有オブジェクトを見つけます。