2017-02-03 2 views
5

を使用して実行可能ファイル私は、次の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からさらにヘッダーを取り除くことはできますか?

+2

リンクされた記事は非常に古いです。 1998年にリリースされたVC++ 6についてです。何もしないバイナリを極端に小さくしようとする動機は何ですか?何か生産的なことをするために、あなたはバイナリをもう一度大きくするランタイムライブラリにリンクしたいと思うでしょう。私は確かに*肥大した*コードを書くことを支持していませんが(それに対しても非常に反対です)、あなたは私の意見ではここの風車で傾いています。リンカがパディングを挿入する理由は十分あります。そして、コードの量が少なくても問題はありません。 –

+0

@Cody Grey:1536のPEヘッダーと定型バイトを節約する私の動機は、ほとんどが学問的なものです。これらのバイトは、現代的なマルチギガバイトRAMシステムを使用しているユーザーには目に見えるメリットはありません。私はまた、コードの総量が少ない(上記の設定でコンパイルすると、50 000バイトより小さい)いくつかのプログラムを開発しています。 – pts

+1

記憶媒体には最小クラスタサイズがあることに注意してください。例えば。 Windowsでは、これは通常4kです。リンカに小さな実行可能ファイルを生成させるように管理しても、ディスク上の多くの領域を占有します。 – greatwolf

答えて

0

この質問は、32ビットおよび64ビットのWindowsの各バージョンは、それらがPEの.EXE実行可能に受け入れるものヘッダ値に対するルールの異なるセットを有し、約1995

から出発して、広範なオンライン文献を有しています。たとえば、Windows XPでは、少なくとも3つのセクションがあり、セクションの配置が4096で、ファイルの配置が少なくとも512の2の累乗でない限り、インポートのある32ビットの.exeファイルは拒否されます(i686-w64-mingw32-gccコマンドは、 Windows 7はこれらの.exeファイルを受け入れますが、0セクション、セクションアライメント4、ファイルアラインメント4の.exeファイルも受け入れます。

2048バイトより小さいワーキング.exeファイルを作成することは可能です。例:

  • hh2.golden.exe(402バイト)までのWindows XP、Windows 7とで動作します。
  • hh4.golden.exe(268バイト)はWindows XPでは動作しません。Windows 7以降で動作します。
  • アセンブリソースコードはpts-tinypeレポに含まれています。

268バイトより小さい.exeファイルは、Windows XPより前のWindowsバージョンでのみ動作し、64ビットWindowsシステムでは動作しません。

関連文献: