どうも
mmapに失敗してるっぽい。
execがどのようにmmapするかというと、
- p_offset をページ境界まで切り捨てる。
- p_offset+p_filesz をページ境界まで切り上げる。
- 上を含むページをp_vaddrをページ境界まで切り捨てて、そこにマップ
うちの環境だけp_fileszがでかくても実行に成功する。mmapの実装はfs依存だけど、ほとんどxfsなんだよなあ。不思議不思議。
mmapは仮想メモリさえ確保できれば成功して、ページフォールトが起こるごとにファイル終端を超えてないかをチェックするっぽい。まあマップしてからトランケートとかもありうるから、それが正しいのだろう。ってことはファイル終端を越えたところにアクセスがあるかどうかが鍵だ。
http://www.linuxhq.com/kernel/v2.6/14/fs/binfmt_elf.c
これだ!bssがページ途中から開始してたら、そこからページ終端までをクリアしてる!
というわけで、ELF golferは2.6.14以降を使いましょう。