HariMainは嫌だ!
- (by K, 2006.03.24)
- 発展課題のページ(全部読む前にここを読むのは混乱するのでおすすめじゃないです)
- 自作OSを作り始めているんだけど、C言語の実行開始関数がHariMainという名前は嫌だという人のためのページです。
仕組み
- 直すのは簡単です。そもそもHariMainという関数がC言語の実行開始関数になっている理由は、haribote.rulを使うからです。
- そのharibote.rulの中身
format:
/* このセクションでリンクの方針を記述 */
code(align:1, logic:0x24, file:0x24);
data(align:4, logic:stack_end, file:code_end);
file:
/* このセクションでコマンドラインに書ききれなかった
.objファイル、.libファイルを記載 */
/* なお、このセクションはフルパスで書いてもよい。 */
/* 例: c:/osask/gg00libc.lib; */
../z_tools/haribote/harilibc.lib;
../z_tools/haribote/golibc.lib;
label:
/* 必ずリンクしなければいけないラベルを指定 */
/* エントリポイントを指定すればいいと思ってください */
_HariStartup;
/* 上記3セクションの順序は入れ替えてはいけません! */
- ポイントはlabel:セクションで_HariStartupを指定しているところです。この関数はharilibc.libの中に入っていて、 omake/tolsrc/hrblib0a/startup.c にソースがあります。
void HariMain(void);
void HariStartup(void)
{
/* 将来HariMainの実行に先立って何かしたくなったら、ここに書き足す */
HariMain();
/* 将来HariMainの終了後に何か処理をさせたくなったら、ここに書き足す */
return;
}
- こうなっています。つまり、_HariStartupが指定されているから、HariMainが最初に実行されることになっていたんです。
直し方
- 1.HariStartupを書き換えて、MyOsMainを呼ぶようにする。
- でもこれだとHariStartupという名前が内部的に残るのでかっこ悪い。
- 2.label:のところを_MyOsMainに書き換えたものを作り、それをmyos.rulとして保存して、自作OSのリンクの際にはこれを指定する。
- これが一番かっこいいと思います。もちろん_MyOsStartup&MyOsMainのあわせ技でもいいです。
- 注意:_mainという指定はできません。無理にやってみてもいいですが、cc1がいろいろ余計なことをやろうとして、うまくいかなくなるのです。
こめんと欄
- ___mainという空の関数を用意したら_mainが使えました。 -- 名無しさん 2009-04-11 (土) 11:46:27
- おお、おめでとうございます! -- K 2009-04-12 (日) 02:44:01
|