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

コメントお名前NameLink

リロード   新規 編集 差分 添付   トップ 一覧 検索 最終更新 バックアップ   ヘルプ   最終更新のRSS
Last-modified: 2009-04-12 (日) 02:44:02 (3935d)