説明とか
は別にいいか。 flatrun.c のハイライトは
ptr = mmap(NULL, size, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_FIXED|MAP_PRIVATE, fd, 0); if (ptr != NULL) return 1;
です。返り値が NULL なら成功、なんて珍しいですよね!
次回は .interp セクションに flatrun を指定してみる…とか考えたけどそれは無理なのであった。
あと「世界一単純な実行ファイルフォーマット」ってのは誇大広告かも。だって COM はヘッダ無いですよねという。
というわけで明日から 7月までアメリカとか行くらしいのでそろそろ準備した方がいい気がします。ゴルフサバは放置していくけどたぶん3ヶ月くらい動いてくれると期待。
binfmt_flat
おお面白そうな。
http://memo.wnishida.com/?date=20070411#p01
なんかぱっと見た感じ、 push/pop はいらない、 EBX は inc EBX 、ってとこでしょうか。
binfmt_flat はわざわざ kernel module 書かなくても binfmt_misc でサクっと書けると思ったので書いてみました。
http://shinh.skr.jp/binary/binfmt_flat.tgz
i@u ~/binfmt_flat> ls Makefile flatrun.c hello* hello.asm setup_binfmt_flat.sh* i@u ~/binfmt_flat> make cc -o flatrun flatrun.c i@u ~/binfmt_flat> sudo ./setup_binfmt_flat.sh i@u ~/binfmt_flat> ls -l hello -rwxr-xr-x 1 i i 31 2007-04-12 22:18 hello* i@u ~/binfmt_flat> ./hello Hello, world!
というわけで 31B の Hello, world! という。
関連
あ、飽きたら
$ sudo sh -c 'echo -1 > /proc/sys/fs/binfmt_misc/flat'
とかで消せます。