[OSASK 5340] Re: GO 計画.

  こんばんは、川合です。

  以前、MinGWでコンパイルしてlcc-win32のリンカでリンクするという
変則技を使っていましたが、あれはMinGWが.commや.lcomなどというセク
ションを生成するので、駄目なケースもありました。

  しかしgo_0001wは.commや.lcomを生成しないので、この変則技が結構
安定するようです。ということで、具体的なやり方を紹介します。

  まず、普通にソースを書きます。たとえばこれを、hello.cとしましょ
う。

  このソースのmain()関数をmain0()と書き換えます。そして以下の手
順でコンパイルします。

prompt>cc1 -Os -quiet -Ie:/lccwin32/include -o hello.s hello.c

ここで-Iオプションはlcc-win32のインクルードパスを指定します。

  さらにアセンブルもします。

prompt>as -o hello.obj hello.s

単純明快ですね。

  それで、次にcallmain.cを作ります。作り方はこのとおり。

---

int main0(int argc, char **argv);

int main(int argc, char **argv)
{
    return main0(argc, argv);
}

---

  ご覧の通り、やっていることはただmain0を呼び出すだけです。これ
をlccでコンパイルしてcallmain.objを作っておきます。

  ここまできたら、後はリンクするだけ。

prompt>lcclnk -s -subsystem console -o hello.exe callmain.obj hello.obj tcconio.lib

とします。完成です。場合によってはlcc-win32だけで作るよりもコン
パクトになります。うーん、good!(笑)。

  まず明らかに分かるとおり、main0()はintを返してargcやargvを引数
に取るようにしてあげてください。そうでないとcallmain.objが困りま
す。

   callmain.objをわざわざ作るのは、もちろんlccのスタートアップル
ーチンとの整合性のためです。インクルードファイルにlccのを使うの
はライブラリの整合性のためです。

  callmain.objさえあれば、コンパイラとしてのlccはいりません。cal
lmain.objは僕が作ったのがあるので、それを公開するとすれば、lccの
includeとリンカとライブラリだけのバージョンがほしくなりますね(
笑)。

  なお、この方法をgo_0001sに使うことはできません。go_0001sはその
ままではlcc-win32のincludeに無いようなライブラリを要求するので。
僕がやっているような改造が必要になります。これについては、go_000
2sをお待ちください。

  それでは。

--
    川合 秀実(KAWAI Hidemi)
OSASK計画代表 / システム設計開発担当
E-mail:kawai !Atmark! imasy.org
Homepage http://www.imasy.org/~kawai/


ML番号でジャンプ
ML単語検索