制御プロセスが 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) /* application id */ #define PS_OBJ_LDSO ((const char *)0x1) /* runtime linker id */
制御プロセスは、次の擬似コードを使用して、これらのオブジェクト用の 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 ファイルは、制御プログラムによってそのシンボル情報をテストできます。