[英]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.