Go to main content

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

印刷ビューの終了

更新: 2022年7月27日
 
 

ldd (1)

名前

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

形式

ldd [-cDfilLpsvVw] [-d | -r] [-e envar] [-S dir] [-U | -u] file...

説明

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

デフォルトでは、ldd は、検査対象のファイルに関連するすべての共有オブジェクト依存関係のロードをトリガーします。このような依存関係には、すべてのレイジーな依存関係、遅延依存関係、およびフィルタ対象が含まれます。そのため、ldd では、可能性のある最大の依存関係セットが報告されます。ただし、通常のプロセス実行時は、レイジーな依存関係、遅延依存関係、およびフィルタ対象は、参照されたときにはじめてロードされます。たとえば、多くのシステムライブラリは、さまざまな機能を提供するために、それをサポートする依存関係を必要とします。ldd ではそのような依存関係がすべて報告されますが、通常のプロセス実行時はこのようなサポート依存関係は必要でない場合があります。「使用法」の「レイジー読み込み」およびLazy Loading of Dynamic Dependencies in Oracle Solaris 11.4 Linkers and Libraries Guideを参照してください。

このもっとも簡単な形式の ldd では、検査対象のオブジェクトの依存関係の要件が分析されます。ldd で各オブジェクトの再配置の要件を分析するように指示することもでき、それによってシンボル参照がシンボル定義に結合されます。

ldd により検査される動的オブジェクトは実行されません。このため、ldd を実行しても、dlopen(3C) を使って明示的に追加された共有オブジェクトは一切表示されません。

プロセスまたはコアファイルにより使用されているオブジェクトをすべて表示するには、pldd(1) を使用します。

オプション

サポートしているオプションは、次のとおりです。

–c

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

–D

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

デフォルトでは、ldd は遅延フィルタ対象を報告しません。–l オプションを参照してください。

–d

即時参照をチェックします。「使用法」の「インタフェースの検証」を参照してください。

–e envar

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

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

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

–f

安全でない実行可能ファイルの検査を強制します。When ldd is invoked by with an effective uid of 0, by default ldd does not process any executable that is not secure.実行可能ファイルは、指定されたインタプリタが /lib または /usr/lib にない場合、セキュアでないとみなされます。インタプリタが判別できない場合にも、実行可能ファイルは安全でないとみなされます。「使用法」の「セキュリティー」を参照してください。

–i

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

–L

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

–l

あらゆるフィルタを強制的に即時処理します (すべてのフィルタ対象とその依存関係を表示するため)。フィルタの即時処理は、ldd のデフォルトの動作モードです。ただし、このデフォルトモードでは、遅延フィルタ対象、または検出されなかった補助フィルタ対象はそのまま無視されます。–l オプションを使用すると、遅延フィルタ対象が、見つからなかった補助フィルタ対象とともに一覧表示されます。

–p

未解決の明示的なおよび外部参照をすべて表示します。「使用法」の「外部インタフェース」を参照してください。

–r

即時参照とレイジー参照の両方をチェックします。「使用法」の「インタフェースの検証」を参照してください。

–S dir

パス検索で見つかったすべてのオブジェクトに適用されるシステムルートを指定します。デフォルトでは、パス検索はシステムルートディレクトリ / を基準にしていると解釈されます。

–s

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

–U

未参照または未使用の依存関係を表示します。未参照の依存関係が、file でロードされたほかのオブジェクトによりバインドされていない場合、その依存関係は未使用として設定されます。巡回の外部にあるオブジェクトにバインドされていない巡回依存関係は、未参照ともみなされます。このオプションは、未使用の検索パスも表示します。「使用法」の「使用されない対象物」を参照してください。

–u

未使用のオブジェクトを表示します。「使用法」の「使用されない対象物」を参照してください。

–v

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

–V
–-version

バージョン情報を出力してすぐに終了します。

–w

未解決の弱いシンボル参照を表示します。「使用法」の「弱い参照」を参照してください。

–?
–-help

使用法に関するメッセージを出力したあと、すぐに終了します。

使用法

外部インタフェース

共有オブジェクトでは、共有オブジェクトの呼び出し元によって指定されるシンボルを参照できます。これらの参照は、共有オブジェクトの作成時に、から使用可能、または単純に外部であることを明示的に分類できます。ld(1)–M mapfile オプションと、PARENT および EXTERN シンボル定義キーワードを参照してください。

動的実行可能ファイルの検査時に、依存関係の参照または外部参照を解決できない場合、それらにはエラーとしてフラグが設定されます。共有オブジェクトの検査時に、解決できない参照または外部参照には、エラーとしてフラグが設定されません。

–p オプションを –d オプションまたは –r オプションと組み合わせて使用すると、未解決の参照または外部参照に、エラーとしてフラグが設定されます。

初期化順序

動的オブジェクトがプロセスにロードされるとき、オブジェクトが提供する任意の初期化コードが実行されます。さまざまなオブジェクトの初期化コードを実行する順序は、オブジェクトの依存関係から決定されます。Initialization and Termination Routines in Oracle Solaris 11.4 Linkers and Libraries Guideを参照してください。

ldd では、ロードするオブジェクトの初期化順序を表示できます。この分析は、主に循環型依存関係の検出に役立ちます。依存関係が通常のプロセスにロードされる正確な順序は異なる場合があるため、実行時に実際に行われる初期化も ldd で示されるものとは異なる場合があります。

必要な依存関係が明示的に定義されていないオブジェクトでは、使用するオプションによって、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/lib/libc.so.1 の関数を参照します。ただし、このライブラリに明示的な依存関係はありません。再配置が検出されてはじめて、依存関係が確立され、その結果、この暗黙的な依存関係により初期化セクションのソート順序が影響を受けます。

通常、アプリケーションの実行時に設定される初期化セクションのソート順序は、ldd–d オプションを指定した場合と同等です。最適な順序が得られるのは、すべてのオブジェクトでそれぞれの依存関係が完全に定義されている場合です。動的オブジェクトを作成する場合は、ld(1) でオプション –z defs および –z ignore を使用することをお勧めします。

1 つ以上の動的オブジェクトが相互に参照する場合には、循環型依存関係が生じる可能性があります。循環型依存関係は、各依存関係固有のソート順序を確立できないので、避けなければなりません。

インタフェースの検証

ldd では、検査対象のオブジェクトのシンボル参照およびシンボル定義の互換性をチェックできます。–d および –r オプションを指定すると、lddfile をプロセスにロードするときに発生する可能性のある未解決のシンボル参照について、警告を出力します。

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

即時参照は通常、実行可能ファイルまたは共有オブジェクトコードによって使用されるデータ項目への参照です。即時参照は、関数へのポインタでもあり、位置に依存する共有オブジェクトから行われる関数呼び出しでもあります。レイジー参照は通常、位置に依存しない共有オブジェクトから行われるグローバル関数呼び出しか、実行可能ファイルから行われる外部関数呼び出しです。これらの参照タイプの詳細は、When Relocations Are Performed in Oracle Solaris 11.4 Linkers and Libraries Guideを参照してください。

オブジェクトの読み込みは、再配置処理の影響も受けます。詳細は、「使用法」の「レイジー読み込み」を参照してください。

Lazy Loading

レイジー読み込みは、レイジーな依存関係と遅延依存関係を確立することにより直接適用できます。ld(1)–z lazyload オプションと –z deferred オプションを参照してください。レイジー読み込みを間接的に適用するには、フィルタを指定します。See the –f option and –F option of ld(1).レイジー読み込み技法をオブジェクトに適用する場合、使用するオプションによっては、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) は、検査対象のオブジェクトを作成するために使用したリンク行から削除可能な候補です。

セキュリティー

A privileged user should use the –f option only if the executable to be examined is known to be trustworthy.The use of –f on an untrustworthy executable while having access to non-basic privileges or authorizations can compromise system security.If the trustworthiness of an executable is unknown, the user should temporarily become a regular user, then invoke ldd as this regular user.

:r サブコマンドを使用しないかぎり、dump(1), elfdump(1), elfedit(1)、および mdb(1) を使用して、信頼できないオブジェクトを安全に検査できます。In addition, a non-privileged user can use either the :r subcommand of mdb, or truss(1) to examine an untrustworthy executable without too much risk of compromise.信頼できない実行可能ファイルで lddmdb :r、または truss を使用する場合は、リスクを最小限に抑えるために UID "nobody" を使用してください。

Unused Material

ldd は依存関係の使用を検証できます。1 つのシンボル参照が 1 つの依存関係にバインドされているときのみ、その依存関係が使用されていると考えられます。With the –U option and the –u option, ldd prints warnings for any unreferenced, or unused dependencies that are loaded when file is loaded.これらのオプションはシンボル参照が検査されているときに有用です。–r オプションが有効でない場合、–d オプションが自動的に有効になります。

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

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

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

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

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

弱い参照

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

属性

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

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

関連項目

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

OracleSolaris 11.4 リンカーとライブラリガイド

診断

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

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