マニュアルページセク ション 1: ユーザーコマンド

印刷ビューの終了

更新: 2014 年 7 月
 
 

ldd(1)

名前

ldd - 実行可能ファイルまたは共有オブジェクトの動的依存関係の表示

形式

ldd [-d | -r] [-c] [-D]  [-e envar] [-f] [-i] [-L] [-l] [-p]
    [-s] [-U | -u] [-v] [-w] filename...

説明

ldd ユーティリティーは、実行可能ファイルまたは共有オブジェクトの動的依存関係を表示します。ldd は実行時リンカー ld.so.1 を使用して診断情報を生成します。実行時リンカーは検査対象のオブジェクトを取得して、実行中のプロセスで使用されるのと同様に処理します。デフォルトでは、ldd は、すべてのレイジーな依存関係、および遅延依存関係の読み込みをトリガーします。

lddfilename の読み込み時に読み込まれるすべての共有オブジェクトのパス名を表示します。ldd は、検査対象の共有オブジェクトに実行権が与えられているものとみなします。実行権が与えられていない場合、ldd は警告を出力してからファイルを処理します。

ldd はファイルを 1 つずつ入力処理します。入力ファイルごとに、ldd は次のいずれかを実行します。

  • オブジェクトの依存関係が存在する場合はその依存関係を表示する

  • 依存関係が存在しない場合はそのまま続行する

  • 正常に処理できなかった場合はエラーメッセージを出力する

ldd により検査される動的オブジェクトは実行されません。このため、ldd を実行しても、dlopen(3C) を使って明示的に追加された共有オブジェクトは一切表示されません。プロセスまたはコアファイルにより使用されているオブジェクトをすべて表示するには、pldd(1) を使用します。

オプション

ldd は、filename とそこで使用される共有オブジェクト間の互換性を調べることもできます。次のオプションを指定すると、lddfilename の実行時に発生する未解決のシンボル参照について、警告を出力します。

–d

即時参照をチェックします。

–r

即時参照およびレイジー参照の両方をチェックします。

1 回の ldd 呼び出しでは、前述のオプションのいずれか一方だけしか指定できません。

即時参照の対象は通常、実行可能ファイルまたは共有オブジェクトコードが使用するデータ項目です。関数へのポインタ、そして、位置に依存する共有オブジェクトからの関数呼び出しです。レイジー参照は通常、位置に依存しない共有オブジェクトからのグローバル関数の呼び出し、または実行可能ファイルからの外部関数呼び出しです。オブジェクトの読み込みは、再配置処理の影響も受けます。詳細は、「使用法」の「レイジー読み込み」を参照してください。

デフォルトでは、一部の未解決のシンボル参照は報告されません。次のオプションを使用すると、未解決の参照を報告できます。これらのオプションは、–d オプションまたは –r オプションと組み合わせてはじめて効果を発揮します。

–p

明示的な参照および外部参照に対する未解決のシンボルエラーを公開します。

–w

未解決の弱いシンボル参照を公開します。

共有オブジェクトでは、共有オブジェクトの呼び出し元によって指定されるシンボルを参照できます。これらの参照は、共有オブジェクトの作成時に、から使用可能、または単純に外部であることを明示的に分類できます。ld(1)–M mapfile オプションと、PARENT および EXTERN シンボル定義キーワードを参照してください。動的実行可能ファイルの検査時に、解決できない参照または外部参照には、エラーとしてフラグが設定されます。ただし、デフォルトでは、共有オブジェクトの検査時に、解決できない参照または外部参照には、エラーとしてフラグが設定されません。–p オプションを –d オプションまたは –r オプションと組み合わせて使用すると、未解決の参照または外部参照に、再配置エラーとしてフラグが設定されます。

再配置で使用されるシンボルを弱い参照として定義できます。デフォルトでは、弱いシンボル参照が解決できない場合、再配置は無視され、再配置オフセットにゼロが書き込まれます。–w オプションを –d オプションまたは –r オプションと組み合わせて使用すると、弱いシンボル参照に対する未解決の再配置に、再配置エラーとしてフラグが設定されます。

ldd は依存関係についても確認できます。次に示す各オプションを使用すると、ldd は、filename が読み込まれたときに、未参照または未使用の依存関係が読み込まれた場合に、それらに対する警告を出力します。1 つのシンボル参照が 1 つの依存関係にバインドされているときのみ、その依存関係が使用されていると考えられます。したがって、これらのオプションはシンボル参照が検査されているときにのみ有用です。–r オプションが有効でない場合、–d が有効になります。

オブジェクトにより定義されているが、オブジェクトからバインドされていない依存関係は、未参照の依存関係です。filename が読み込まれたときにその他のオブジェクトによりバインドされていない依存関係は、未使用のオブジェクトです。

依存関係は、デフォルトのシステム上の場所か、検索パスで指定された場所で検出できます。検索パスは、環境変数 LD_LIBRARY_PATH などで、グローバルに指定できます。検索パスは、動的オブジェクトで実行パスとして定義することもできます。ld(1)–R オプションを参照してください。依存関係を満たすために使用されない検索パスは、不要なファイルシステム処理を発生させる原因となります。

–U

未参照または未使用の依存関係を表示します。未参照の依存関係が、filename で読み込まれたほかのオブジェクトによりバインドされていない場合、その依存関係は未使用としても設定されます。巡回の外部にあるオブジェクトにバインドされていない巡回依存関係は、未参照ともみなされます。

このオプションは、未使用の検索パスも表示します。

–u

未使用のオブジェクトを表示します。

–U–u の機能をすべて含んでいますが、–U または –u オプションのどちらか 1 つだけを ldd の 1 回の呼び出しの間に指定できます。–r オプションを使用するとき未参照または未使用であると判明したオブジェクトは、依存関係として削除する必要があります。これらのオブジェクトは参照を提供しませんが、filename が読み込まれるとき、不必要なオーバーヘッドを生みます。–d オプションを使用する場合、未参照または未使用と判明したオブジェクトは filename が読み込まれるときにすぐには要求されません。これらのオブジェクトはレイジー読み込みの候補です。詳細は、「使用法」の「レイジー読み込み」を参照してください。

未使用の依存関係を削除すると、実行時リンクのオーバーヘッドを下げることができます。未参照の依存関係を削除すると、実行時リンクのオーバーヘッドを下げることができますが、その効果はより少なくなります。ただし、未参照の依存関係の削除は、異なるオブジェクトと組み合わされたときや、その他のオブジェクトの依存関係が変化するに伴って、依存関係が使用されなくなることを防ぐ役割を果たします。

未使用の検索パスを削除することで、依存関係の検出に必要な処理を削減できます。これは、ネットワーク経由でファイルサーバーのファイルにアクセスする場合に有効です。検索パスは dlopen(3C) の要件を満たすために、オブジェクト内に符号化されている場合があります。この検索パスは、このオブジェクトの依存関係を取得するためには必要がない場合があるため、ldd では未使用とみなされます。

次のオプションを使用できます。

–c

一切の構成ファイルの使用を禁止します。構成ファイルは、デフォルトの検索パスの変更、ディレクトリキャッシュの提供、および代替オブジェクト依存関係の提供に利用できます。crle(1) を参照してください。

–D

遅延依存関係の読み込みをスキップします。デフォルトでは、ldd は、レイジーな依存関係と遅延依存関係の両方の処理を強制します。–L オプションも参照してください。通常のプロセス実行時は、遅延依存関係が読み込まれるのは、遅延参照への最初の実行時結合が行われるときだけです。–D オプションを使用すると、–d オプションまたは –r オプションを使用しても、遅延依存関係の読み込みはトリガーされません。ld(1)–z deferred オプションを参照してください。

–e envar

環境変数 envar を設定します。

このオプションは、LD_PRELOAD などの、ldd そのものに悪影響を与える可能性のある実行時リンカー環境変数を試す場合に便利です。

このオプションは、LD_DEBUG などの追加情報だけを検査中のオブジェクトから抽出する場合にも役立ちます。ld.so.1(1)lari(1) を参照してください。

–f

安全でない実行可能ファイルの検査を強制します。スーパーユーザーが呼び出した場合、ldd はデフォルトで、安全でないことが判明した実行可能ファイルを一切処理しません。実行可能ファイルは、指定されたインタプリタが /lib または /usr/lib にない場合、安全でないとみなされます。インタプリタが判別できない場合にも、実行可能ファイルは安全でないとみなされます。「使用法」の「セキュリティー」を参照してください。

–i

初期化セクションの実行順序を表示します。表示される順序は、–d または –r オプションの使用によって変わります。「使用法」の「初期化順序」を参照してください。

–L

レイジー読み込みを有効にします。デフォルトでは、ldd は、レイジーな依存関係と遅延依存関係の両方の処理を強制します。–D オプションも参照してください。通常のプロセス実行時は、レイジー読み込みがデフォルトの動作モードです。この場合、レイジーオブジェクト内で定義されているシンボルが参照されたときに、レイジーな依存関係またはフィルタだけがプロセスに読み込まれます。–L オプションとともに –d または –r オプションを使用すると、実行プロセスで発生する依存関係および読み込み順序を調べることができます。ld(1)–z lazyload オプションを参照してください。

–l

あらゆるフィルタを強制的に即時処理します (すべてのフィルタとその依存関係を表示するため)。フィルタの即時処理は現在、ldd のデフォルトの動作モードです。ただし、このデフォルトモードでは、検出されなかった外部フィルタはそのまま無視されます。–l オプションを使用すると、検出されなかった外部フィルタに起因するエラーメッセージが生成されます。

–s

共有オブジェクトの依存関係を調べるのに使用した検索パスを表示します。

–v

filename の処理中に発生したすべての依存関係を表示します。このオプションを指定すると、依存関係が要求するバージョン情報も表示します。pvs(1) を参照してください。

使用法

セキュリティー

スーパーユーザーは、検査対象の実行可能ファイルが信頼できると判明している場合に限り、–f オプションを使用します。信頼できない実行可能ファイルに –f オプションを使用すると、システムのセキュリティーが損なわれる可能性があります。検査対象の実行ファイルが信頼できるものかどうかが不明な場合、スーパーユーザーは一時的に一般ユーザーになり、一般ユーザーとして ldd を呼び出す必要があります。

:r サブコマンドを使用しないかぎり、dump(1)elfdump(1)elfedit(1)、および mdb(1) を使用して、信頼できないオブジェクトを安全に検査できます。また、スーパーユーザー以外のユーザーは mdb:r サブコマンドまたは truss(1) を使用することによって、それほどリスクを冒さずに信頼できない実行可能ファイルを検査できます。信頼できない実行可能ファイルで lddmdb :r、または truss を使用する場合は、リスクを最小限に抑えるためにUID "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) などのツールを使用して依存関係を調べることができます。

ファイル

/usr/lib/lddstub

共有オブジェクトの依存関係を検査するために読み込まれた 32 ビット擬似実行可能ファイル

/usr/lib/64/lddstub

共有オブジェクトの依存関係を検査するために読み込まれた 64 ビット擬似実行可能ファイル

属性

属性についての詳細は、マニュアルページの attributes(5) を参照してください。

属性タイプ
属性値
使用条件
system/linker

関連項目

crle(1), dump(1), elfdump(1), elfedit(1), lari(1), ld(1), ld.so.1(1), mdb(1), pldd(1), pvs(1), truss(1), dlopen(3C), attributes(5)

Oracle Solaris 11.2 リンカーとライブラリガイド

診断

ldd は共有オブジェクトのパス名の記録を標準出力に書き込みます。シンボルの解決問題に関する任意選択のリストは、標準エラー出力に書き込まれます。filename が実行可能ファイルまたは共有オブジェクトではない場合、あるいは、読み取り用にオープンできない場合、ゼロ以外の終了ステータスが返されます。

共有オブジェクトで –d または –r オプションを使用すると、誤解を生じるような結果が出力される場合があります。ldd は共有オブジェクトにおける最悪の場合を解析します。しかし実際には、未解決として報告されたシンボルでも、その一部または全部が共有オブジェクトを参照する実行可能ファイルによって解決されることがあります。実行時リンカーのプリロードメカニズムを使用すると、検査対象のオブジェクトに依存関係を追加できます。LD_PRELOAD を参照してください。

ldd は実行時リンカーと同じアルゴリズムを使用して、共有オブジェクトを見つけます。