実行時リンカーのリンクマップで維持される各オブジェクト情報の取得は (「名前空間の確立」を参照)、rtld_db.h に定義された次の構造を使用して実現されます。
typedef struct rd_loadobj { psaddr_t rl_nameaddr; unsigned rl_flags; psaddr_t rl_base; psaddr_t rl_data_base; unsigned rl_lmident; psaddr_t rl_refnameaddr; psaddr_t rl_plt_base; unsigned rl_plt_size; psaddr_t rl_bend; psaddr_t rl_padstart; psaddr_t rl_padend; psaddt_t rl_dynamic; } rd_loadobj_t; |
文字列ポインタを含めて、この構造で指定されるアドレスはすべてターゲットプロセス内のアドレスであり、制御プロセス自体のアドレス空間のアドレスでないことに注意してください。
動的オブジェクトの名前を含む文字列へのポインタ
リビジョン RD_VERSION2 では、動的に読み込まれる再配置可能オブジェクトは RD_FLG_MEM_OBJECT で識別されます。
動的オブジェクトの基本アドレス
動的オブジェクトのデータセグメントの基本アドレス
リンクマップ識別子 (「名前空間の確立」を参照)
動的オブジェクトがフィルタの場合は (「フィルタとしての共有オブジェクト」を参照)、フィルティーの名前を指定する
これらの要素は、下方互換性のために存在するものであり、現在は使用されていない
オブジェクトのエンドアドレス (text + data + bss)。リビジョン RD_VERSION2 では、動的に読み込まれる再配置可能オブジェクトの場合、この要素は作成されたオブジェクトの最後を指します。このオブジェクトには、自身のセクションヘッダーが含まれています。
動的オブジェクト前のパッドの基本アドレス (「動的オブジェクトのパッド」を参照)
動的オブジェクト後のパッドの基本アドレス (「動的オブジェクトのパッド」を参照)
このフィールドは RD_VERSION2 に追加されたもので、DT_CHECKSUM (表 7-43 を参照) のエントリへのリファレンスを可能にするオブジェクトの動的セクションのベースアドレスを提供します。
次のルーチンは、このオブジェクトデータ構造を使用して実行時リンカーリンクマップリストの情報にアクセスしています。
typedef int rl_iter_f(const rd_loadobj_t *, void *); rd_err_e rd_loadobj_iter(rd_agent_t * rap, rl_iter_f * cb, void * clnt_data); |
この関数は、ターゲットプロセスに現在読み込まれている動的オブジェクトすべてを反復します。各反復時に、cb によって指定されたインポート関数が呼び出されます。clnt_data は、cb 呼び出しにデータを渡すために使用できます。各オブジェクトに関する情報は、スタックが割り当てられた volatile rd_loadobj_t 構造へのポインタを介して返されます。
cb ルーチンからの戻りコードは、rd_loadobj_iter() によってテストされ、次の意味を持ちます。
1 - リンクマップの処理を継続
0 - リンクマップの処理を停止して、制御プロセスに制御を返す
rd_loadobj_iter() は、正常だと RD_OK を返します。RD_NOMAPS が返される場合、実行時リンカーは、まだ初期リンクマップを読み込みません。