を使用して実行可能ファイル私は、次のCプログラムを持っている:はMinGWの
i686-w64-mingw32-gcc -s -Os -fno-ident -fno-stack-protector -fomit-frame-pointer \
-fno-unwind-tables -fno-asynchronous-unwind-tables -falign-functions=1 \
-mpreferred-stack-boundary=2 -falign-jumps=1 -falign-loops=1 -mconsole \
-nostdlib -nodefaultlibs -nostartfiles -o h.exe h.c -lkernel32
:
#include <windows.h>
void __cdecl mainCRTStartup() {
DWORD bw;
HANDLE hfile = GetStdHandle(STD_OUTPUT_HANDLE);
WriteFile(hfile, "Hello, World!\r\n", 15, &bw, 0);
ExitProcess(0); /* Needed for successful (0) exit. */
}
を私は、次のコマンドラインを使用して、GCC 4.8.2でコンパイル生成された.exeファイルの長さは2048バイトです。 MinGWを使用して、それを小さくするにはどうすればいいですか?1024バイト以下、512バイト以下であることが望ましいですか?
私はアセンブリコードを書かずに解決策を望んでいますが、アセンブリソリューションにも興味があります。
私は、セクション(セグメント)の数を減らすために-Wl,-N
を試しましたが、ワインで.exeを実行するとsegfaultが発生しました。
このarticleは、480バイトが可能であることを示しています。これは、次の設定を使用しています:
#pragma comment(linker, "/FILEALIGN:16")
#pragma comment(linker, "/ALIGN:16")// Merge sections
#pragma comment(linker, "/MERGE:.rdata=.data")
#pragma comment(linker, "/MERGE:.text=.data")
#pragma comment(linker, "/MERGE:.reloc=.data")
#pragma optimize("gsy", on)
残念ながら、これらの#pragma
sがMinGWのGCCでは動作しません。同等のものはありますか? hereで
私は752バイトに.exeファイルのサイズをダウンさせるGCCフラグ -Wl,--section-alignment,16,--file-alignment,16
を見つけることができました。 .exeはWineで動作するようです。 modifying the linker scriptことで
は私が.data
と.rdata
をマージし、736バイトにまで行くことができました。私は上記のものに加えて、これらのGCCフラグを使用しています:-Wl,--section-alignment,16,--file-alignment,16,-T,tinygccpe.scr
。
私はまだMinGW相当の/MERGE
を探しています。
This questionは似ていますが、9000バイト以下になることはありません。
私もオフセット0x40のと0x80の間にあるDOSスタブを(削除することができstrip
ツール(MinGWの中strip
コマンドが.exeのサイズ任意の更なる減少しない)を探しています、それはThis program cannot be run in DOS mode.
が含まれている、我々は、 64バイトを節約できます)。 This codeは削除できますが、.exe内の絶対オフセットもすべて破損します。残念ながら、MinGWのリンカーld
は、DOSスタブを削除することができません。ファイルbfd/peXXigen.c
で、NT_SIGNATURE
の直上にハードコードされています。
ローダーが使用しないヘッダーなど、.exeからさらにヘッダーを取り除くことはできますか?
リンクされた記事は非常に古いです。 1998年にリリースされたVC++ 6についてです。何もしないバイナリを極端に小さくしようとする動機は何ですか?何か生産的なことをするために、あなたはバイナリをもう一度大きくするランタイムライブラリにリンクしたいと思うでしょう。私は確かに*肥大した*コードを書くことを支持していませんが(それに対しても非常に反対です)、あなたは私の意見ではここの風車で傾いています。リンカがパディングを挿入する理由は十分あります。そして、コードの量が少なくても問題はありません。 –
@Cody Grey:1536のPEヘッダーと定型バイトを節約する私の動機は、ほとんどが学問的なものです。これらのバイトは、現代的なマルチギガバイトRAMシステムを使用しているユーザーには目に見えるメリットはありません。私はまた、コードの総量が少ない(上記の設定でコンパイルすると、50 000バイトより小さい)いくつかのプログラムを開発しています。 – pts
記憶媒体には最小クラスタサイズがあることに注意してください。例えば。 Windowsでは、これは通常4kです。リンカに小さな実行可能ファイルを生成させるように管理しても、ディスク上の多くの領域を占有します。 – greatwolf