当我编译一个空操作程序时:
使用各种编译器:
GCC(与LLVM类似):使用
Windows Driver Kit 7.1: 使用
Windows 2003 Driver Development Kit:产生了一个3.5 KiB的可执行文件。 - 包含的节:
Tiny C Compiler (TCC):产生了一个1.5 KiB的可执行文件。 - 包含的节:
int main(void)
{
return 0;
}
使用各种编译器:
GCC(与LLVM类似):使用
-s
编译,产生了一个10-KiB的可执行文件。
- 包含的节: .CRT
, .bss
, .data
, .idata
, .rdata
, .text
, .tls
- 依赖于msvcrt.dll
和kernel32.dll
MSVC 2010:使用/MD /Ox
编译,产生了一个5.5 KiB的可执行文件。
- 包含的节: .data
, .rdata
, .reloc
, .text
- 依赖于msvcr100.dll
和kernel32.dll
- 可以通过将.rdata
与.text
合并来进一步减小文件大小。Windows Driver Kit 7.1: 使用
/MD /Ox
编译,并通过链接msvcrt_winxp.obj
使其可以在XP上运行,产生了一个6.5 KiB的可执行文件。
- 包含的节: .data
, .rdata
, .text
- 依赖于msvcrt.dll
和kernel32.dll
- 可以通过将.rdata
与.text
合并来进一步减小文件大小。Windows 2003 Driver Development Kit:产生了一个3.5 KiB的可执行文件。 - 包含的节:
.data
, .rdata
, .text
- 依赖于msvcrt.dll
- 可以通过将.rdata
与.text
合并来进一步减小文件大小。Tiny C Compiler (TCC):产生了一个1.5 KiB的可执行文件。 - 包含的节:
.data
, .text
- 依赖于msvcrt.dll
所以,我想问题很简单:
是否有可能进一步减小GCC或LLVM的目标可执行文件大小,使它们更接近最小可能值,同时仍链接到msvcrt.dll
?
(编辑:我显然不想要像UPX
之类的打包工具。)
-s
选项与strip
基本相同。其他选项也没有帮助。 - user541686gcc-4.6 -O2 -flto -s nop.c -o nop
编译,得到一个4408字节的nop
文件;使用gcc-4.6 -Os -flto -s nop.c -o nop
编译,则得到一个4392字节的文件。 - Basile Starynkevitch