【发布时间】:2011-12-17 19:09:40
【问题描述】:
当我编译一个无操作程序时:
int main(void)
{
return 0;
}
使用各种编译器:
-
GCC(也与 LLVM 的结果相似):提供 10-KiB 可执行文件(使用
-s编译)部分:
.CRT、.bss、.data、.idata、.rdata、.text、.tls取决于
msvcrt.dll和kernel32.dll
-
MSVC 2010:提供 5.5 KiB 可执行文件(使用
/MD /Ox编译)部分:
.data、.rdata、.reloc、.text取决于
msvcr100.dll和kernel32.dll可以通过将
.rdata与.text合并进一步减少
-
Windows Driver Kit 7.1:提供了一个 6.5 KiB 的可执行文件(使用
/MD /Ox编译,与msvcrt_winxp.obj链接以允许它在 XP 上运行)部分:
.data、.rdata、.text取决于
msvcrt.dll和kernel32.dll可以通过将
.rdata与.text合并进一步减少
-
Windows 2003 驱动程序开发工具包:提供 3.5 KiB 的可执行文件
部分:
.data、.rdata、.text取决于
msvcrt.dll可以通过将
.rdata与.text合并进一步减少
-
Tiny C 编译器 (TCC):提供 1.5 KiB 的可执行文件
部分:
.data、.text取决于
msvcrt.dll
所以我想问题很简单:
是否可以进一步减小 GCC 或 LLVM 的目标可执行文件大小,使它们更接近可能的最小值,同时仍链接到 msvcrt.dll?
(编辑:我显然不是在寻找像 UPX 这样的包装器)
【问题讨论】:
-
你能解释一下你为什么问这个问题吗?你经常编译这么小的程序吗?编译器编译出逼真的程序不是更重要吗? (大多数都更大)!
-
@Ulterior:
-s选项与strip几乎相同。其他选项也没有帮助。 -
在带有
gcc-4.6 -O2 -flto -s nop.c -o nop的Linux/x86-64/Debian/Sid 上,我得到一个4408 字节的nop文件,使用gcc-4.6 -Os -flto -s nop.c -o nop编译时为4392 字节 -
@BasileStarynkevitch:部分原因是偏执,部分原因实际上是一个实际问题:我经常发送 Base64 版本的可执行文件,发送 Base64 版本的 1-当您将 KiB 可执行文件粘贴到例如 10-KiB 可执行文件中时一条消息。
标签: gcc size executable llvm