名前 | 形式 | 機能説明 | オプション | 使用法 | ファイル | 属性 | 関連項目 | 診断 | 注意事項
ldd ユーティリティは、実行可能ファイルまたは共有オブジェクトの動的依存関係を表示します。ldd は実行時リンカー ld.so.1 を使用して診断情報を生成します。検査対象のオブジェクトは、実行中のプロセスで使用されるのと同様に扱われます。デフォルトでは、すべてのレイジーな依存関係の読み込みをトリガーします。
filename が実行可能ファイルである場合、ldd は filename の読み込み時に読み込まれるすべての共有オブジェクトのパス名を表示します。
filename が共有オブジェクトである場合、ldd は filename の読み込み時に読み込まれるすべての共有オブジェクトのパス名を表示します。ldd は、共有オブジェクトに実行権が与えられているものとみなします。実行権が与えられていない場合、ldd は警告を出力してからファイルを処理します。
ldd はファイルを 1 つずつ入力処理します。入力ファイルごとに、ldd は次のいずれかを実行します。
オブジェクトの依存関係が存在する場合はその依存関係を表示する
依存関係が存在しない場合はそのまま続行する
正常に処理できなかった場合はエラーメッセージを出力する
ldd は、filename とそこで使用される共有オブジェクト間の互換性を調べることもできます。次のオプションを指定すると、ldd は filename の実行時に発生する未解決のシンボル参照について、警告を出力します。
即時参照をチェックします。
即時参照およびレイジー参照の両方をチェックします。
1 回の ldd 呼び出しでは、上記のオプションのいずれか一方だけしか指定できません。即時参照の対象は通常、実行可能または共有オブジェクトが使用するデータ項目、関数へのポインタ、そして、位置に依存する共有オブジェクトからの関数呼び出しです。レイジー参照は通常、位置に依存しない共有オブジェクトからのグローバル関数の呼び出し、または実行可能ファイルからの外部関数呼び出しです。各参照タイプの詳細は、『リンカーとライブラリ』の「再配置処理の実行に関する説明」を参照してください。オブジェクトの読み込みは、再配置処理の影響も受けます。詳細は「レイジー読み込み」を参照してください。
いっさいの構成ファイルの使用を禁止します。構成ファイルは、デフォルトの検索パスの変更、ディレクトリキャッシュの提供、および代替オブジェクト依存関係の提供に利用できます。crle(1) のマニュアルページを参照してください。
環境変数 envar を設定します。このオプションは、ldd そのものに悪影響を与える可能性のある実行時リンカー環境変数を試す場合に便利です。
安全でない実行可能ファイルの検査を強制します。スーパーユーザーが呼び出した場合、ldd はデフォルトで、安全でないことが判明した実行可能ファイルをいっさい処理しません。実行可能ファイルは、指定されたインタプリタが /usr/lib または /etc/lib にない場合、あるいは、インタプリタが判別できない場合は、安全でないとみなされます。「セキュリティ」を参照してください。
初期化セクションの実行順序を表示します。表示される順序は、-d または -r オプションの使用によって変わります。「初期化順序」を参照してください。
レイジー読み込みを有効にします。これは、検査対象のオブジェクトをプロセスの一部として読み込む場合のデフォルトの動作モードです。この場合、レイジーオブジェクト内で定義されているシンボルが参照されたときに、レイジーな依存関係またはフィルタだけがプロセスに読み込まれます。-L オプションとともに -d または -r オプションを使用すると、実行プロセスで発生する依存関係および読み込み順序を調べることができます。
あらゆるフィルタを強制的に即時処理します。(すべてのフィルタとその依存関係を表示するため)フィルタの即時処理は現在、ldd のデフォルトの動作モードです。ただし、このデフォルトモードでは、検出されなかった外部フィルタはそのまま無視されます。-l オプションを使用すると、検出されなかった外部フィルタに起因するエラーメッセージが生成されます。
共有オブジェクトの依存関係を調べるのに使用した検索パスを表示します。
未使用の依存関係を表示します。シンボル参照が依存関係に結合している場合、その依存関係は使用されたとみなされます。したがって、このオプションが有効なのは、シンボル参照を検査しているときだけです。-r オプションが無効の場合、-d オプションが有効になります。
-r オプションを使用したときに、未使用であることが判明したオブジェクトは、依存関係として削除されるべきです。これらのオブジェクトは参照を提供しませんが、filename の読み込み時に不要なオーバーヘッドが生じます。-d オプションを使用したときに、未使用であることが判明したオブジェクトは、filename の読み込み時にすぐに必要なわけではないので、レイジー読み込みの候補のものです (「レイジー読み込み」を参照)。
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 => /usr/lib/libelf.so.1 libnsl.so.1 => /usr/lib/libnsl.so.1 libc.so.1 => /usr/lib/libc.so.1 |
実行時にこのオブジェクトを使用した場合の レイジー読み込み動作は、-L オプションを使用することによって有効にできます。このモードの場合、レイジーな依存関係が読み込まれるのは、レイジーオブジェクト内で定義されているシンボルが参照されたときです。したがって、-L オプションを -d および -r オプションと組み合わせて使用すると、即時参照とレイジー参照のそれぞれを満たすのに必要な依存関係を調べることができます。
example% ldd -L main example% ldd -d main libc.so.1 => /usr/lib/libc.so.1 example% ldd -r main libc.so.1 => /usr/lib/libc.so.1 libelf.so.1 => /usr/lib/libelf.so.1 |
この例の場合、出力される依存関係の順序は、オプションなしで実行した ldd の場合と異なります。また、-r オプションを使用した場合とも異なります。レイジー依存関係に対する参照は、実行中のプログラムと同じ順序では発生しません。
レイジー読み込みを調べると、参照を満たす必要のないオブジェクトも明らかになります。このようなオブジェクト (上記の例では libnsl.so.1) は、検査対象のオブジェクトを作成するために使用したリンク行から削除可能な候補です。
必要な依存関係が明示的に定義されていないオブジェクトでは、使用するオプションによって、ldd によって表示される初期化セクションの順序が異なる場合があります。次に、簡単な適用例を示します。
example% ldd -i main libA.so.1 => ./libA.so.1 libc.so.1 => /usr/lib/libc.so.1 libB.so.1 => ./libB.so.1 init object=./libB.so.1 init object=./libA.so.1 init object=/usr/lib/libc.so.1 |
再配置が適用されると、初期化セクションの順序は次のようになります。
example% ldd -ir main ......... init object=/usr/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 |
adb(1), crle(1), dump(1), elfdump(1), ld(1), ld.so.1(1), pvs(1), truss(1), dlopen(3DL), attributes(5)
ldd は共有オブジェクトのパス名の記録を 標準出力に書き込みます。シンボルの解決問題に関する任意選択のリストは、標準エラー出力に書き込まれます。filename が実行可能ファイルまたは共有オブジェクトではない場合、あるいは、読み取り用にオープンできない場合、ゼロ以外の終了ステータスが返されます。
ldd は、dlopen(3DL) を使用して明示的に接続された共有オブジェクトを表示しません。
共有オブジェクトで -d または -r オプションを使用すると、誤解を生じるような結果が出力される場合があります。ldd は共有オブジェクトにおける「最悪の場合」の解析を行います。しかし実際には、未解決として報告されたシンボルでも、その一部または全部が共有オブジェクトを参照する実行可能ファイルによって解決されることがあります。実行時リンカーのプリロードメカニズム (LD_PRELOAD) を使用すると、検査対象のオブジェクトに依存関係を追加できます。
ldd は実行時リンカーと同じアルゴリズムを使用して、共有オブジェクトを見つけます。