[Subject Prev][Subject Next][Thread Prev][Thread Next][Subject Index][Thread Index]

[OSASK 1856] Over the link32!



  こんにちは、川合です。

  また暑くなってきました。おかげであまり集中できず、OSASK本体の
改良を見合わせています。

  それで昨日から、gglib04aの改良をやってみました。・・・というの
は、ライブラリがずいぶん大きくなったように感じたからです。

  OSASKの長所はたくさんありますが、その中の一つに、「実行ファイ
ルがコンパクト」というのがあります。これは、実行ファイルに想像を
絶するようなすさまじい圧縮がかかっているからではなく、そもそもOS
とのインターフェースがシンプルだからこそ、実現されているというの
が僕の主張です(まあ、定数テーブル(スタティックデーター)などに
簡単な圧縮がかかっている事は認めますが・・・笑)。

  さて、この主張をより説得力あるものにするためには、「普通にプロ
グラムを書けば、自然にコンパクトになる」というのが理想です。ASKA
で書かないとあまり小さくならないのが現状ですが、プログラマーの大
半がC言語を使う以上、これでは説得力に欠けます。

  ・・・と思いつつ、tviewc00の.mapファイルを見てみてください。実
行ファイルの内訳は、

  OSASKにとっては無駄なヘッダー : 544バイト (0x0220)
  コード   : 1963バイト (0x07ab)
  データー :  368バイト (0x0170)

となっています。そして、このデーターの部分は適当に圧縮されるから
あまり気にしなくていいんです。しかし、コードはでかいです。そして
このコードの内訳が、

  tviewc00.c  に由来するもの : 592バイト (0x0250)
  guigui00.libに由来するもの : 928バイト (0x03a0)
  stdlib.lib  に由来するもの : 443バイト (0x01bb)

となっています。これはひどいです。本体が600バイトもないのに、そ
の倍(928+443=1371)もの大きさのライブラリーをくっつけなきゃいけな
いなんて、どう見ても「OSとのインターフェースがシンプル」ではない
です。

  僕は暑さでぼんやりしていた意識を少し集中して考えました、なぜこ
んなことになっているのかを。・・・それは簡単な理由です。ライブラ
リー関数の大半はC言語で書かれていますが、lcc-win32の最適化がたい
したこと無いからです。これをアセンブラで書いてやれば、改善するは
ずです。・・・どうせ、ライブラリーなんて可読性があまりよくなくて
もいいです。可読性なんかよりも、コンパクトで速いほうがずっとあり
がたいはずです(それに、どうしても可読性にこだわりたければ、今の
gglib04aを使えばいいだけの事です・・・内容はいっしょですから)。

  さて、guigui00.libやstdlib.libの中身をアセンブラ化するなんて、
ぼんやりしていてもできるくらい簡単な事です。やっちゃいました。こ
の結果をご覧ください。

  OSASKにとっては無駄なヘッダー : 560バイト (0x0230)
  コード   : 1197バイト (0x04ad)
  データー :  144バイト (0x0090)

  tviewc00.c  に由来するもの : 704バイト (0x02c0)
  guigui00.libに由来するもの : 240バイト (0x00f0)
  stdlib.lib  に由来するもの : 253バイト (0x00fd)

  ・・・どうです。ライブラリーは合計で493バイトです。ほぼ1/3です
。いくつかの関数をマクロで実現したため、tviewc00.c由来の部分が増
えていますが、問題になりません。

  .BINファイルの大きさは、よほどデーターが大きくない限りは、[ヘ
ッダー]と[コード]の和に等しいです。したがって、2507バイトが1757
バイトになったわけです。ソースを改変することなくこんなに得をする
なら、誰だってこっちを使おうと思うはずです。

  これで終われば「めでたしめでたし」だったのですが、そうは行かな
かったのです。よく見ると、ヘッダーが560バイトになっているではあ
りませんか。これは非常に困ります。なぜなら、exe2bin2はヘッダーの
サイズが544バイトであるのを前提に作ってあるからです。今まで、ヘ
ッダーが560バイトになった事なんて一度もありません。僕は困ってし
まいました。このヘッダーにも対応しないと、新しいライブラリーは使
えない事になってしまいます。

  対応するために、まずはヘッダーがどのように変更されたのかバイナ
リーエディターで見てみました。どうも、16バイトの"00"がただ途中に
挟まっただけのようです。こんなのに意味があるんでしょうか。僕は非
常に疑問を感じました。

  また、多くの試行錯誤をして、どういう条件でヘッダーのサイズが増
えるのかも調べてみました。これは、MASMで作った.OBJファイルがいく
つリンクされるかで決まっているようです。それで、MASMが出力する.O
BJファイルとlcc-win32が出力する.OBJファイルの違いを詳細に比較し
ましたが、どれがその因子になっているのかを特定する事はできません
でした。

  僕はだんだん腹が立ってきていました。そもそも、僕はlink32が嫌い
でした。山ほどのオプションを付けなければ役にたたないし、そのくせ
出力される.EXEファイルには役にたたない544バイトものヘッダーがく
っついてくるからです。それに加えての、今回の件です。

  もし、link32の代わりにもっと素直なリンカーあって、無駄なヘッダ
ーを出力しなければ、tviewc00.binはさらに縮んで1320バイトくらいに
なるはずです(概算)。今はこの差の430バイトを諦めているわけです
。

  逆に考えてみましょう。僕がlink32の代替リンカーを作ってよくない
事があるでしょうか。どうせ暑くて難しい事はできないんだし、多分1
週間もかからないし、link32のためだけにmasmをダウンロードする必要
もなくなります。僕が作るのは単純なものですから、link32のように45
3KBなんていう大きさにもならないでしょう。多分20KB未満です。

  そんなわけで、暑い日が続いたら代替リンカーが出てくるのではない
かと期待してください(笑)。

  それでは。

--
    川合 秀実(KAWAI Hidemi)
川合堂社長 / OSASK計画総指揮 / カーネル開発班
E-mail:kawai !Atmark! imasy.org
Homepage http://www.imasy.org/~kawai/