制御プロセスが librtld_db.so.1 に対して提供しなければならないインポートインタフェースは、/usr/include/proc_service.h に定義されています。これらの proc_service 関数のサンプル実装状態は、rdb デモデバッガにあります。rtld-デバッガインタフェースは、使用可能な proc_service インタフェースのサブセットだけを使用します。rtld-デバッガインタフェースの今後のバージョンでは、互換性のない変更を作成することなく、追加 proc_service インタフェースを利用できる可能性があります。
次のインタフェースは、現在、rtld-デバッガインタフェースによって使用されています。
ps_err_e ps_pauxv(const struct ps_prochandle * ph, auxv_t ** aux); |
この関数は、auxv ベクトルのコピーへのポインタを返します。auxv ベクトル情報は、割り当てられた構造にコピーされるため、このポインタの存続期間は、ps_prochandle が有効な間になります。
ps_err_e ps_pread(const struct ps_prochandle * ph, paddr_t addr, char * buf, int size); |
この関数は、アドレス addr にあるターゲットプロセスからサイズバイトを読み取って、それらを buf にコピーします。
ps_err_e ps_pwrite(const struct ps_prochandle * ph, paddr_t addr, char * buf, int size); |
void ps_plog(const char * fmt, ...); |
この関数は、rtld-デバッガインタフェースから追加診断情報によって呼び出されます。この診断情報をどこに記録するか、または記録するかどうかは、制御プロセスが決める必要があります。ps_plog() の引数は、printf(3C) 形式に従っています。
ps_err_e ps_pglobal_lookup(const struct ps_prochandle * ph, const char * obj, const char * name, ulong_t * sym_addr); |
この関数は、ターゲットプロセス ph 内のオブジェクト obj 内の記号 name を検索します。記号が検出されると、記号のアドレスが sym_addr に保存されます。
ps_err_e ps_pglobal_sym(const struct ps_prochandle * ph, const char * obj, const char * name, ps_sym_t * sym); |
この関数は、ターゲットプロセス ph 内のオブジェクト obj 内の記号 name を検索します。記号が検出されると、記述子 sym は埋められます。
rtld-デバッガインタフェースがアプリケーションまたは実行時リンカー内の記号を検出してから、リンクマップを作成する必要があるイベントでは、obj に対する次の予約値を使用できます。
#define PS_OBJ_EXEC ((const char *)0x0) /* application id */ #define PS_OBJ_LDSO ((const char *)0x1) /* runtime linker id */ |
制御プロセスがこれらのオブジェクトの記号テーブルを検出するために使用できる機構の 1 つに、次の擬似コードを使用する procfs ファイルシステムを介するものがあります。
ioctl(.., PIOCNAUXV, ...) - obtain AUX vectors ldsoaddr = auxv[AT_BASE]; ldsofd = ioctl(..., PIOCOPENM, &ldsoaddr); /* process elf information found in ldsofd ... */ execfd = ioctl(.., PIOCOPENM, 0); /* process elf information found in execfd ... */ |
ファイル記述子が見つかったら、ELF ファイルは、制御プログラムによってその記号情報をテストできます。