リンカーとライブラリ

読み込み可能オブジェクトの走査

実行時リンカーのリンクマップで維持される各オブジェクト情報の取得は (「名前空間の確立」を参照)、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;

文字列ポインタを含めて、この構造で指定されるアドレスはすべてターゲットプロセス内のアドレスであり、制御プロセス自体のアドレス空間のアドレスでないことに注意してください。

rl_nameaddr

動的オブジェクトの名前を含む文字列へのポインタ

rl_flags

リビジョン RD_VERSION2 では、動的に読み込まれる再配置可能オブジェクトは RD_FLG_MEM_OBJECT で識別されます。

rl_base

動的オブジェクトの基本アドレス

rl_data_base

動的オブジェクトのデータセグメントの基本アドレス

rl_lmident

リンクマップ識別子 (「名前空間の確立」を参照)

rl_refnameaddr

動的オブジェクトがフィルタの場合は (「フィルタとしての共有オブジェクト」を参照)、フィルティーの名前を指定する

rl_plt_base, rl_plt_size

これらの要素は、下方互換性のために存在するものであり、現在は使用されていない

rl_bend

オブジェクトのエンドアドレス (text + data + bss)。リビジョン RD_VERSION2 では、動的に読み込まれる再配置可能オブジェクトの場合、この要素は作成されたオブジェクトの最後を指します。このオブジェクトには、自身のセクションヘッダーが含まれています。

rl_padstart

動的オブジェクト前のパッドの基本アドレス (「動的オブジェクトのパッド」を参照)

rl_padend

動的オブジェクト後のパッドの基本アドレス (「動的オブジェクトのパッド」を参照)

rl_dynamic

このフィールドは RD_VERSION2 に追加されたもので、DT_CHECKSUM (表 7-43 を参照) のエントリへのリファレンスを可能にするオブジェクトの動的セクションのベースアドレスを提供します。

次のルーチンは、このオブジェクトデータ構造を使用して実行時リンカーリンクマップリストの情報にアクセスしています。

rd_loadobj_iter()

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 が返される場合、実行時リンカーは、まだ初期リンクマップを読み込みません。