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