netbsd-currentでexec_elf32_makecmdsはどこにあるの?

netbsd-currentでsys/kern/kern_exec.cを読んでいたが、まずどこでelfヘッダの中身を取り出すのかが分からなかった。
そこで追ってみるとどうもcheck_exec()の以下箇所で実施しているらしいことまではわかりました。

403 for (i = 0; i < nexecs; i++) {
404 int newerror;
405
406 epp->ep_esch = execsw[i];
407 newerror = (*execsw[i]->es_makecmds)(l, epp);
408
(sys/kern/kern_exec.c)

ということは・・・。会社で2.0なNetBSDをいじっている私はexec_elf32_makecmdsがあることを期待しました。
grepすると確かにあるのですが、ctagsなタグを読んでも定義先に行き着けない・・・。

仕方なしにmakecmdsでgrepをかけてみるとsys/kern/exec_elf.cというファイルがあり、その中を探すとexec_elf_makecmds()という関数がありました。
さらに探すと

95 #define exec_elf_makecmds ELFNAME2(exec,makecmds)
(sys/kern/exec_elf.c)

という定義がありました。
ELFNAME2はマクロで

939 #if defined(ELFSIZE)
940 #define CONCAT(x,y) __CONCAT(x,y)
941 #define ELFNAME(x) CONCAT(elf,CONCAT(ELFSIZE,CONCAT(_,x)))
942 #define ELFNAME2(x,y) CONCAT(x,CONCAT(_elf,CONCAT(ELFSIZE,CONCAT(_,y))))
943 #define ELFNAMEEND(x) CONCAT(x,CONCAT(_elf,ELFSIZE))
944 #define ELFDEFNNAME(x) CONCAT(ELF,CONCAT(ELFSIZE,CONCAT(_,x)))
945 #endif
(sys/sys/exec_elf.h)

となっています。
ELFSIZEは・・・あちこちで定義されていてどこのELFSIZE使っているんだか分からない・・・orz
しかし、仮にELFSIZEが32だとすると
#define exec_elf_makecmdsは CONCAT(exec,CONCAT(_elf,CONCAT(32,CONCAT(_makecmds))))
になり、文字列をつなぎ合わせる事で
exec_elf_makecmds -> exec_elf32_makecmds
となります。
つまり、exec_elf32_makecmdsの本体はexec_elf_makecmdsだということになります。
こんなところにいたのか・・・・。

今日は遅いので明日この関数の中を読んでみる事にします。