30os

# Makefile の設定
CC=gcc -m32
LD=ld -m elf_i386 --oformat binary
AS=as --32 -march=i386
QEMU=qemu-system-i386 -m 32 -localtime -vga std -fda

クロスコンパイルするので sudo apt-get install gcc-multilib が必要です。

Cコンパイラとして $(CC), リンカとして $(LD), アセンブラとして $(AS) を使ってください。 gcc にも ld, as フロントエンドとして同じ機能がある筈ですが、該当オプションの渡し方が違うみたいで素直に ld, as 使いました。 QEMU は自作 OS イメージ(*.img)のシミュレーション用で、-m 32 は 32 bit 環境とかではなく 32 MB メモリを使うという意味です。

...

あけましておめでとうございます。

という具合に私のプログラミング書き初め (?) は GNU アセンブラ でした。 マイナビ出版の電子書籍が年末年始セールにて、 30日でできる! OS自作入門 を半額で購入したのがきっかけです。

この本は 2006 年に発行されたので、まだ 64 bit 環境が一般的でなく、 解説に従うと 32 bit のアセンブラを C 言語とリンクして動かさなくてはいけません。 好みの問題ですが、GNU アセンブラで書いてみたかったので検索したところ、 こちらのブログ が見つかりました。 これで順調に読んでいけるぞ、と思いきや、上記の 32 bit のアセンブラ命令と gcc でコンパイルした C オブジェクトとのリンクが上手く行かず詰まったので、試行錯誤した結果をメモしました。

ところで、バイナリ用語(略語)の elf (Executable & Linking Format) とか dwarf (Debug With Arbitrary Record Format) っていうオタクな感じがセンス良いですね。