const mdb_modinfo_t *_mdb_init(void);
リンケージと識別を可能にするために、各デバッガモジュールには _mdb_init() という関数を提供する必要があります。この関数は、自動変数として宣言されない固定の mdb_modinfo_t 構造体を指すポインタを返します。これについては、<sys/mdb_modapi.h> に次のように定義されています。
typedef struct mdb_modinfo { ushort_t mi_dvers; /* デバッガの API のバージョン番号 */ const mdb_dcmd_t *mi_dcmds; /* NULL で終了する dcmd のリスト */ const mdb_walker_t *mi_walkers; /* NULL で終了する walk のリスト */ } mdb_modinfo_t; |
mi_dvers メンバーは API のバージョン番号を識別するためのもので、常に MDB_API_VERSION に設定されます。このようにして現在のバージョン番号が各デバッガモジュールの中にコンパイルされているので、デバッガは、モジュールが使用するアプリケーションのバイナリインタフェースを識別し、検証できます。デバッガは、自らのバージョンより新しいバージョンの API に対してコンパイルされているモジュールは読み込みません。
mi_dcmds と mi_walkers というメンバーは、NULL でない場合はそれぞれ dcmd と walker の定義構造体の配列を指しています。どちらの配列も NULL 要素で終了していなければなりません。これらの dcmd と walker は、モジュールを読み込むプロセスの一部としてデバッガによってインストールされ、登録されます。dcmd または walker が正しく定義されていなかったり、名前が重複していたり無効であったりした場合、デバッガはそのモジュールの読み込みを拒否します。dcmd と walker の名前には、引用符や括弧など、デバッガにとって特別な意味を持つ文字を入れることはできません。
モジュールでは、モジュール API を使用して _mdb_init() のコードを実行し、読み込むべきかどうかを判定することもできます。たとえば、特定のシンボルが存在する場合だけ、特定のターゲットに対して該当するモジュールは存在します。これらのシンボルが見つからない場合、このモジュールは _mdb_init() 関数から NULL を返します。この場合、デバッガによってこのモジュールの読み込みは拒否され、該当するエラーメッセージが出力されます。
void _mdb_fini(void);
mdb_alloc() によって以前に割り当てられた固定メモリーの解放など、読み込み解除に先立って一定のタスクを実行するモジュールの場合は、_mdb_fini() という関数を宣言してこれを行うことができます。この関数はデバッガでは必要とされません。この関数を宣言すると、モジュールの解除の前に一度呼び出されます。ユーザーがデバッガの終了を要求したとき、またはユーザーが ::unload 組み込み dcmd を使用して明示的にモジュールを解除したときに、モジュールは解除されます。