制御プロセスは、実行時リンカーの適用範囲内で発生する特定のイベントを追跡できます。これらのイベントは次のとおりです。
実行時リンカーは、すべての動的オブジェクトを読み込んで再配置し、読み込まれた各オブジェクトの .init セクションの呼び出しを開始します。
実行時リンカーは、すべての .init セクションの呼び出しを終了して、基本実行可能プログラムに制御を渡します。
実行時リンカーは、動的オブジェクトを読み込みまたは読み込み解除のために呼び出されます。
これらのイベントは、次のインタフェース (sys/link.h と rtld_db.h に定義) を使用して監視できます。
typedef enum { RD_NONE = 0, RD_PREINIT, RD_POSTINIT, RD_DLACTIVITY } rd_event_e; /* * Ways that the event notification can take place: */ typedef enum { RD_NOTIFY_BPT, RD_NOTIFY_AUTOBPT, RD_NOTIFY_SYSCALL } rd_notify_e; /* * Information on ways that the event notification can take place: */ typedef struct rd_notify { rd_notify_e type; union { psaddr_t bptaddr; long syscallno; } u; } rd_notify_t;
イベントを追跡する関数を次に示します。
この関数は、イベント監視を有効 (1) または無効 (0) にします。
rd_err_e rd_event_enable(struct rd_agent * rdap, int onoff);
パフォーマンス上の理由から、現在、実行時リンカーはイベントの無効化を無視します。制御プロセスは、このルーチンへの最後の呼び出しが原因で指定のブレークポイントに到達しないと、想定することはできません。
この関数は、制御プログラムへの指定イベントの通知方法を指定します。
rd_err_e rd_event_addr(rd_agent_t * rdap, rd_event_e event, rd_notify_t * notify);
イベントの種類によっては、制御プロセスの通知は、notify->u.syscallno で特定される害のない簡単なシステム呼び出しの呼び出しや、notify->u.bptaddr で指定されるアドレスでのブレークポイントの実行で行われます。システム呼び出しの追跡または実際のブレークポイントの設定は、制御プロセスが行う必要があります。
イベントが発生した場合は、rtld_db.h に定義された次のインタフェースによって追加情報を取得できます。
typedef enum { RD_NOSTATE = 0, RD_CONSISTENT, RD_ADD, RD_DELETE } rd_state_e; typedef struct rd_event_msg { rd_event_e type; union { rd_state_e state; } u; } rd_event_msg_t;
rd_state_e の値を次に示します。
使用可能な追加状態情報はありません。
リンクマップは安定した状態にあってテスト可能です。
動的オブジェクトは削除処理中であり、リンクマップは安定した状態ではありません。リンクマップは、RD_CONSISTANT 状態に達するまでテストできません。
動的オブジェクトは削除処理中であり、リンクマップは安定した状態ではありません。リンクマップは、RD_CONSISTANT 状態に達するまでテストできません。
rd_event_getmsg() 関数を使用して、このイベント状態情報を取得します。
次の表は、異なる各イベントタイプで可能な状態を示しています。
RD_PREINIT |
RD_POSTINIT |
RD_DLACTIVITY |
---|---|---|
RD_NOSTATE |
RD_NOSTATE |
RD_CONSISTANT |
|
|
RD_ADD |
|
|
RD_DELETE |