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