gcc -s とその先

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

ファイルサイズが大きすぎる

WinMain 関数で、最後に 0 を返すだけで何の処理も行わない C のソースコード nop.c を gcc でコンパイルすると、90.9 KB の EXE ファイルが出来上がる。

gcc nop.c -mwindows

何もしないのに 90.9 KB になるとか、どういうことなの・・。

オプション -s で小さくする

gcc には -s というオプションがあり、ファイルサイズを小さくする効果がある。

gcc -v --help では、以下のように説明されている。

-s, --strip-all        Strip all symbols

シンボルというものを生成アプリケーションファイルから取り除くという意味である。

シンボルとは、アプリケーションのデバッグをしやすくするために埋め込むものらしいので、通常は不要である。

gcc nop.c -mwindows -s

この -s オプションをつけて実行すると、一気に 18.0 KB まで減った。

もっと小さくしたいのだが

しかし、まだ大きい。何もしないのに 18.0 KB もある。ちょっとしたフリーソフトの中には、5KB 程度のものがあったはずだ。何か秘訣があるに違いない。

というわけで、World Wide Web で調べていたのだが、いくつかの役立つ情報を入手することができた。

gcc が行う 2 つの処理、すなわち、コンパイルとリンクであるが、肥大化の原因となるライブラリをリンクしないようにすればよさそうだ。

そこで、リンク処理用のオプションを試したのだが、-nostdlib-nodefaultlibs ではうまくいかなかった。

つづく