リンカーとライブラリ

手続きリンクテーブルのスキップ

rtld-デバッガインタフェースは、手続きリンクのテーブルエントリをスキップオーバーするための機能を提供します (「手続きリンクテーブル (プロセッサに固有)」を参照)。デバッガなどの制御プロセスは、初めて関数に介入するよう要求される場合、実際の手続きリンクテーブル処理をスキップしようとします。この結果、制御は、関数定義を検索するために実行時リンカーに渡されます。

次のインタフェースを使用すると、制御プロセスで実行時リンカーの手続きリンクテーブル処理にステップオーバーできます。制御プロセスは、ELF ファイルで提供される外部情報に基づいて、手続きリンクのテーブルエントリに遭遇する時期を判定できるものと想定されます。

ターゲットプロセスは、手続きリンクのテーブルエントリに介入すると、次のインタフェースを呼び出します。

rd_plt_resolution()

rd_err_e rd_plt_resolution(rd_agent_t * rdap, paddr_t pc,
        lwpid_t lwpid, paddr_t plt_base, rd_plt_info_t * rpi);

この関数は、現在の手続きリンクテーブルエントリの解決状態と、それをスキップする方法に関する情報を返します。

pc は、手続きリンクテーブルエントリの最初の命令を表します。lwpid は lwp 識別子を提供し、plt_base は手続きリンクテーブルの基本アドレスを提供します。これらの 3 つの変数は、各種のアーキテクチャが手続きリンクテーブルを処理するため十分な情報を提供します。

rpi は、次のデータ構造 (rtld_db.h に定義) に定義された、手続きリンクのテーブルエントリに関する詳しい情報を提供します。


typedef enum {
    RD_RESOLVE_NONE,
    RD_RESOLVE_STEP,
    RD_RESOLVE_TARGET,
    RD_RESOLVE_TARGET_STEP
} rd_skip_e;
 
typedef struct rd_plt_info {
        rd_skip_e       pi_skip_method;
        long            pi_nstep;
        psaddr_t        pi_target;
} rd_plt_info_t;

次のシナリオは rd_plt_info_t 戻り値から考えられます。


注 -

今後の実装状態では、ターゲット関数にブレークポイントを直接設定する方法として、RD_RESOLVE_TARGET を使用する可能性がありますが、この機能は、今回のバージョンの rtld-デバッガインタフェースではまだ使用できません。