gcc -nostartfiles

#include <windows.h>
int WINAPI WinMain(HINSTANCE hi, HINSTANCE hp, LPSTR cl, int cs) {
  return 0;
}

小さくしたい

何もしないソース nop.c を gcc -mwindows -s でコンパイル&リンクしたところ、18.0 KB のアプリケーションファイルが生成された。

-s を付けてもなお、ファイルサイズが大きい。このため、リンク処理用のオプションを使って、肥大化の原因であるライブラリをリンクさせないようにしよう。

小さくできる

具体的には、-nostartfiles オプションを使う。

gcc nop.c -mwindows -s -nostartfiles

すると、できあがりのファイルサイズは 3.00 KB となり、劇的に小さくなった。

小ささの仕組み

-nostartfiles については、なぜか gcc -v --help では出力されず、公式のドキュメント に、以下の記載がある。

-nostartfiles Do not use the standard system startup files when linking. The standard system libraries are used normally, unless -nostdlib or -nodefaultlibs is used.

標準スタートアップファイルをリンクしないという効果があるようだ。

生成アプリケーションに標準スタートアップファイルのデータが含まれなくなるため、ファイルサイズが小さくなるのだ。

しかし疑問が残る

スタートアップファイルには、スタートアップルーチンが含まれており、アプリケーション起動時において、main 関数や、WinMain 関数の呼び出しに使われるはずだ。それを含まないということは、正常なプログラム動作が行われないのではなかろうか。

nop.c でつくった 3.00 KB の nop.exe を実行すると、何も起こらない。何も起こさないようにつくってあるから当然であるように思える。が、スタートアップルーチンが実行されていないはずなので、「何もしない」という処理そのものが行われていない可能性がある。

つづk