ナビゲーションリンクをスキップ | |
印刷ビューの終了 | |
Oracle Solaris Studio 12.3: dbx コマンドによるデバッグ Oracle Solaris Studio 12.3 Information Library (日本語) |
動的リンカーは rtld、実行時 ld、または ld.so とも呼ばれ、実行中のアプリケーションに共有オブジェクト (ロードオブジェクト) を組み込むように準備します。rtld が稼働状態になるのは主に次の 2 つの場合です。
プログラムの起動時 - プログラムの起動時、rtld はまずリンク時に指定されたすべての共有オブジェクトを動的に読み込みます。これらは「あらかじめ読み込まれた」共有オブジェクトで、一般に libc.so、libC.so、libX.so などがあります。ldd (1) を使用すれば、プログラムによって読み込まれる共有オブジェクトを調べることができます。
アプリケーションから呼び出しがあった場合 - アプリケーションでは、関数呼び出し dlopen(3) と dlclose(3) を使用して共有オブジェクトやプレーンな実行可能ファイルの読み込みや読み込みの取り消しを行います。
共有オブジェクト (.so) や通常の実行可能ファイル (a.out) のことを、dbx では「ロードオブジェクト」といいます。loadobject コマンド (「loadobject コマンド」参照) を使用して、読み込みオブジェクトからの記号情報のリストの作成および管理ができます。
動的リンカーは、読み込んだすべてのオブジェクトのリストを、link map というリストで管理します。 このリストは、デバッグするプログラムのメモリーに保存され、librtld_db.so で間接的にアクセスできます。これはデバッガ用に用意された特別なシステムライブラリです。
.init セクションは、共有オブジェクトの読み込み時に実行される、その共有オブジェクトのコードの一部分です。たとえば、.init セクションは、C++ 実行時システムが .so 内のすべての静的初期化関数を呼び出すときに使用します。
動的リンカーは最初にすべての共有オブジェクトにマップインし、それらのオブジェクトをリンクマップに登録します。その後、動的リンカーはリンクマップをトラバースし、各共有オブジェクトに対して .init セクションを実行します。syncrtld イベント (「syncrtld」参照) は、これら 2 つの動作の間に発生します。
PLT は、共有オブジェクトの境界間の呼び出しを容易にするために rtld によって使 用される構造体です。たとえば、printf の呼び出しはこの間接テーブルによって行います。その方法の詳細については、SVR4 ABI に関する汎用リファレンスマニュアルおよびプロセッサ固有のリファレンスマニュアルを参照してください。
複数の PLT 間で step コマンドと next コマンドを操作するために、dbx は各ロードオブジェクトの PLT テーブルを追跡する必要があります。テーブル情報は rtld ハンドシェークと同時に入手されます。