如何使用MinGW创建微小的PE(Win32)可执行文件
我有以下C程序:
#include <windows.h> void __cdecl mainCRTStartup() { DWORD bw; HANDLE hfile = GetStdHandle(STD_OUTPUT_HANDLE); WriteFile(hfile,"Hello,World!rn",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) 不幸的是,这些#pragmas不适用于MinGW GCC.有等价物吗? 在here年,我能够找到海湾合作委员会的旗帜 到了modifying the linker script,我能够合并.data和.rdata,并下载到736字节.我除了上面的那些之外还使用这些GCC标志:-Wl,-T,tinygccpe.scr. 我仍在寻找MinGW相当于/ MERGE. This question类似,但它不会尝试低于9000字节. 我也在寻找一个剥离工具(MinGW中的strip命令不会进一步减小.exe大小)可以删除DOS存根(在偏移量0x40和0x80之间,它包含这个程序不能在DOS下运行) mode.,我们可以节省64个字节). This code可以删除它,但它也会破坏.exe中的所有绝对偏移量.不幸的是,MinGW中的链接器ld无法删除DOS存根,它在文件bfd / peXXigen.c中硬编码,就在NT_SIGNATURE之上. 是否可以从.exe中删除更多标题,即加载程序不使用的标题? 解决方法
这个问题有大量的在线文献,从大约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及更高版本. 小于268字节的.exe文件仅适用于Windows XP之前的Windows版本,并且它们不适用于64位Windows系统. 相关文献: > https://www.codejuggle.dj/creating-the-smallest-possible-windows-executable-using-assembly-language/ (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- botframework – Microsoft Bot Framework Client sdk
- Windows 8预加载器(加载图标)使用HTML5和JavaScript无图像
- Windows AD单点登录使用javascript和节点
- windows-7 – Windows 7 RC是否在虚拟机上运行?
- windows-server-2003 – 重启后自动启动Windows Server 200
- windows – 按文件名前缀顺序读取目录中的文件?
- windows-server-2008 – 在.wim中捕获Windows更新,以便可以
- 我的dll代码从一个exe文件中工作,但是无法从Java loadLibra
- .net – 在Windows上生成ActivityTracing事件日志
- 如何确定win32线程在c中处于Wait或Join或Sleep状态
- iis – 具有相同DLL的多个网站的Azure网站内存使
- 在Windows环境中进行部署
- windows – 命令行工具查找Dll依赖关系[已关闭]
- windows-server-2008 – 如何追踪Windows Server
- active-directory – 在Active Directory中授予权
- window下 人工智能 Keras、TensorFlow、PyTorch、
- windows-server-2008-r2 – 适用于Windows Serve
- Windows 2000及更高版本上的DOS选择批处理命令(默
- windows下查看C语言字符数组(俗称:字符串)在内
- WPF:使子元素’MinWidth/MinHeight约束Window