[英]How to create tiny PE (Win32) executables using MinGW
我有以下 C 程序:
#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 編譯它,使用以下命令行:
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
生成的 .exe 文件長 2048 字節。 如何使用 MinGW 使其更小,最好最多 1024 個字節,或者(甚至更好)最多 512 個字節?
我更喜歡不編寫匯編代碼的解決方案,但我也對匯編解決方案感興趣。
我試過-Wl,-N
來減少節(段)的數量,但這會導致在 Wine 中運行 .exe 時出現段錯誤。
本文建議 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
不適用於 MinGW GCC。 有等價物嗎?
在這里,我能夠找到 GCC 標志-Wl,--section-alignment,16,--file-alignment,16
將 .exe 大小降低到 752 字節。 .exe 似乎在 Wine 中工作。
通過修改鏈接器腳本,我能夠合並.data
和.rdata
,並減少到 736 字節。 除了上述那些之外,我還使用這些 GCC 標志: -Wl,--section-alignment,16,--file-alignment,16,-T,tinygccpe.scr
。
我仍在尋找等效於/MERGE
的 MinGW 。
這個問題很相似,但它不會嘗試低於 9000 字節。
我也在尋找一個strip
工具(MinGW 中的strip
命令不會進一步減小 .exe 的大小),它可以刪除 DOS 存根(位於偏移量 0x40 和 0x80 之間,它包含This program cannot be run in DOS mode.
,我們可以節省 64 個字節)。 此代碼可以刪除它,但它也會破壞 .exe 中的所有絕對偏移量。 不幸的是,MinGW 中的鏈接器ld
無法刪除 DOS 存根,它被硬編碼在文件bfd/peXXigen.c
,就在NT_SIGNATURE
。
是否可以從 .exe 中刪除更多的頭文件,即加載程序不使用的頭文件?
這個問題有大量的在線文獻,大約從 1995 年開始。
32 位和 64 位 Windows 的每個版本都有一套不同的規則,用於說明它們在 PE .exe 可執行文件中接受哪些標頭值。 例如,Windows 7 接受具有 0 節、節對齊 4、文件對齊 4 的 .exe 文件,而其他版本的 Windows(例如 Windows XP 和 2020 年的最新 Windows 10)拒絕這些文件。
不過,可以創建小於 2048 字節的有效 .exe 文件。 例子:
這就是為什么不太可能發布小於 584 字節的便攜式 Win32 PE .exe hello-world 的原因:
小於 268 字節的 .exe 文件僅適用於早於 Windows XP 的 Windows 版本,它們不適用於 64 位 Windows 系統。
相關文獻:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.