如何使用MinGW创建微小的PE(Win32)可执行文件

时间:2017-02-03 10:30:25

标签: c winapi mingw portable-executable

我有以下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时会导致段错误。

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不适用于MinGW GCC。有等价物吗?

here中,我找到了GCC标志 {。}}将.exe大小降低到752字节。 .exe似乎适用于Wine。

通过modifying the linker script,我能够合并-Wl,--section-alignment,16,--file-alignment,16.data,并降低到736字节。除了以上那些之外,我正在使用这些GCC标志:.rdata

我仍然在寻找相当于-Wl,--section-alignment,16,--file-alignment,16,-T,tinygccpe.scr的MinGW。

This question类似,但它不会尝试低于9000字节。

我也在寻找一个/MERGE工具(MinGW中的strip命令不会进一步减小.exe大小),这可以删除DOS存根(位于偏移量0x40和0x80,它包含strip,我们可以节省64个字节)。 This code可以删除它,但它也会破坏.exe中的所有绝对偏移量。遗憾的是,MinGW中的链接器This program cannot be run in DOS mode.无法删除DOS存根,它在文件ld中硬编码,位于bfd/peXXigen.c之上。

是否可以从.exe中删除更多标题,即加载程序不使用的标题?

1 个答案:

答案 0 :(得分:2)

这个问题有大量的在线文献,从大约1995年开始。

每个版本的32位和64位Windows对PE .exe可执行文件中接受的标头值有不同的规则。例如,Windows XP拒绝带有导入的32位.exe文件,除非它们至少有3个部分,并且它们的部分对齐是4096,并且它们的文件对齐是2的幂,至少为512.(i686-w64-mingw32-gcc命令在问题生成这样的可执行文件。)Windows 7接受这些.exe文件,但它也接受带有0个部分的.exe文件,部分对齐4,文件对齐4。

可以创建小于2048字节的工作.exe文件。例如:

  • hh2.golden.exe(402字节)适用于Windows XP,Windows 7及更高版本。
  • hh4.golden.exe(268字节)在Windows XP上不起作用,适用于Windows 7及更高版本。
  • pts-tinype repo。
  • 中包含的汇编源代码

小于268字节的.exe文件仅适用于Windows XP之前的Windows版本,并且它们不适用于64位Windows系统。

相关文献: