外部シンボルの違いへの対応
Linuxでgccでコンパイルするとグローバルな関数名や変数名はそのまま外部シンボルになるが、Windowsではこの関数名や変数名の前にアンダースコア'_'がついて外部シンボルとなる。また、アセンブリコードではどちらの環境でも外部シンボルの値は同じになる。つまり、Cのソースからアセンブリのサブルーチンを呼び出すとき、アセンブリのソースからCの関数を呼び出すときはシンボル名の違いに気を付けて名前を指定する必要がある。
しかし、この名前の設定も環境が変わるとうまくいかなくなる。そこで、現状のMONAのソースコードでは環境に応じてアセンブリの外部シンボルを変更させるためのマクロを用意している。つまり、Windowsで実行するときは自動的に外部シンボルにアンダースコアをつけ、そうでないときにはそのままの名前を外部シンボルとして設定するようにしている。この設定の切り替えはアセンブラにBUILD_ON_LINUXというマクロを設定するかいなかで切り替えられるようになっている。
が、そんなことをせずともgccには便利なオプションがついている。gcc実行時に-fleading-underscoreというオプションを付ければ勝手に外部シンボルにアンダースコアを付けてくれる。以下、この方法を採用してMONAをビルドすることにする。
gccにオプションを設定させるために、configureスクリプトを一部修正する。configureスクリプトの下の方にいくとMakefile.incの内容を設定している部分がある。この部分のCFLAGSという変数がgccのオプションとなる部分である。この部分をちょっと変更させる。
CFLAGS= (中略)-fleading-underscore
configureの対応
Linux上でMONAをビルドしようとすると、まずこの問題に取りかからなければならない。現状のconfigureスクリプトはMinGWをインストールしていないLinuxでの使用を想定していないのである。そのまま実行すると次のようなエラーメッセージが出てきてしまう。
[taka@tkralia mona]$ ./configure Host type... Unknown OS type.
このままでは先に進まないので、configureスクリプトのHOST OSをチェックしている部分を一部変更することにする。
case $OSTYPE in cygwin) HOST=CYGWIN ;; linux) HOST=LINUX ;; *) echo 'Unknown OS type' exit 1 ;; esac
これでひとまず、configureスクリプトが動作するようになる。
名前を入れてください。
何も書かない予感。
数式が入れられればなあ。(何を書くのだ?)
訪問者5000人突破
[MONA] 久々の更新
とりあえず、リハビリがてら短いのを作成。
内容はMONA-0.3.0でのブートシーケンスに関すること。
実はMONA解析ページのトップページには作者しか知らない
ページがいくつか隠されていたりする。
5000人突破記念にブートネタでひとつ紹介する。
http://tkralia.hp.infoseek.co.jp/mona/BPB.txt
こいつはBIOSブートパラメタブロックというやつで、firstboot.asmの
先頭で定義してある変な変数の一覧だ。