Oracle® Developer Studio 12.5: dbx コマンドによるデバッグ

印刷ビューの終了

更新: 2016 年 6 月
 
 

動的リンカー

動的リンカーは rtld、実行時 ld、または ld.so とも呼ばれ、実行中のアプリケーションに共有オブジェクト (ロードオブジェクト) を組み込む準備をします。rtld がアクティブになる 2 つの主な領域:

  • プログラムの起動時 - プログラムの起動時、rtld はまずリンク時に指定されたすべての共有オブジェクトを動的に読み込みます。これらのプリロードされた共有オブジェクトには、libc.solibC.solibX.so などがあります。ldd (1) を使用すると、プログラムによってロードされる共有オブジェクトがわかります。

  • アプリケーションから呼び出しがあった場合 - アプリケーションでは、関数呼び出し dlopen(3) と dlclose(3) を使用して共有オブジェクトやプレーンな実行可能ファイルの読み込みや読み込みの取り消しを行います。

dbx ではロードオブジェクトという用語を使用して、共有オブジェクト (.so) や実行可能ファイル (a.out) を表します。loadobject コマンドを使用して、ロードオブジェクトのシンボリック情報を一覧表示し、管理できます。

リンクマップ

動的リンカーは、読み込んだすべてのオブジェクトのリストを、link map というリストで管理します。 リンクマップは、デバッグされているプログラムのメモリーに保存され、デバッガによって使用される特殊なシステムライブラリの librtld_db.so によって間接的にアクセスされます。

起動手順と .init セクション

.init セクションは、共有オブジェクトの読み込み時に実行される、その共有オブジェクトのコードの一部分です。たとえば、.init セクションは、C++ 実行時システムが .so ファイル内のすべての静的初期化関数を呼び出すために使用します。

動的リンカーは最初にすべての共有オブジェクトにマップインし、それらのオブジェクトをリンクマップに登録します。その後、動的リンカーはリンクマップをトラバースし、各共有オブジェクトに対して .init セクションを実行します。syncrtld イベントはこれらの 2 つのフェーズの間に発生します。詳細については、syncrtld イベント指定を参照してください。

プロシージャリンケージテーブル

プロシージャリンケージテーブル (PLT) は、共有オブジェクトの境界間の呼び出しを容易にするために rtld によって使用される構造体です。たとえば、printf の呼び出しはこの間接テーブルによって行います。詳細については、汎用およびプロセッサ固有の SVR4 ABI のリファレンスマニュアルを参照してください。

PLT 間で step コマンドと next コマンドを操作するために、dbx は各ロードオブジェクトの PLT テーブルを追跡する必要があります。テーブル情報は rtld ハンドシェークと同時に取得されます。