Oracle Solaris Studio 12.2: dbx コマンドによるデバッグ

動的リンカー

動的リンカーは rtld、実行時 ld、または ld.so とも呼ばれ、実行中のアプリケーションに共有オブジェクト (ロードオブジェクト) を組み込むように準備します。rtld が稼働状態になるのは主に次の 2 つの場合です。

共有オブジェクト (.so) や通常の実行可能ファイル (a.out) のことを、dbx では「ロードオブジェクト」といいます。loadobject コマンド (loadobject コマンド」参照) を使用して、読み込みオブジェクトからの記号情報のリストの作成および管理ができます。

リンクマップ

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

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

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

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

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

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

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