ブートローダを書いたときの困りごと

OS自作入門で遊ぼうとしたが、この本はWindows向けのNASMでブートローダが書かれていてLinuxな私は困っていた。
そこで、Interface 2002年7月号掲載のブートローダを写経して、GNUなプログラム環境でもばっちり動くような企てをした。

Interface 2002年7月号記事のサポートページ:http://www.skyfree.org/jpn/interface/index.html

ところが、stage2(boot2)まで書いてMakeをかけると・・・・。

bios_mem.o: In function `copy_block':
bios_mem.c:(.text+0x42): undefined reference to `__stack_chk_fail'
make: *** [stage2] エラー 1

というエラーをリンカが吐いて終了してしまう。
色々調べると、gcc4.1からスタックをガードするための仕組みがあり、スタックオーバフロー検出時に呼ばれる関数が__stack_chk_failの正体である。
詳細は、http://d.hatena.ne.jp/yupo5656/20060625/p2 を参照のこと。

別にブートローダにこんなのいらないし・・・。
ということで色々調べると、コンパイルオプションで「-fno-stack-protector」を指定することでこの機能を無効化することができる。

早速Makeをすると、無事にMakeが通りましたとさ。めでたし、めでたし。