为什么* * nothing *的EXE文件包含如此多的虚拟零字节?

时间:2011-01-05 09:46:08

标签: c null executable exe zero

我已经编译了一个绝对没有任何内容的C文件(只有main返回...甚至没有“Hello,world”被打印出来),我用各种编译器编译它(MinGW) GCC,Visual C ++,Windows DDK等)。所有这些都与C运行时链接,这是标准的。

但我得不到的是:当我在十六进制编辑器(或反汇编程序)中打开文件时,为什么我看到16 KB中几乎一半只是0x00字节或0xCC字节的大部分?对我来说这似乎很荒谬......有什么方法可以阻止这些事件发生吗?为什么他们首先出现在那里?

谢谢!

2 个答案:

答案 0 :(得分:8)

可执行文件通常包含代码段和至少一个数据段。我猜这些都有一个标准的最小尺寸,可能是8K。未使用的空间用零填充。另请注意,用更高级别(而不是汇编语言)编写的EXE在您自己的代码和数据的直接翻译之上包含一些额外的东西:

  • 启动和终止代码(在C及其后续代码中,它处理输入参数,调用main(),然后在退出main()后清理)
  • 存根代码和数据(例如,Windows可执行文件包含一个小的DOS程序存根,其唯一目的是显示消息“此程序在DOS下不可执行”)。

仍然,因为可执行文件通常应该做某事(即它们的代码和数据段确实包含有用的东西),并且存储很便宜,默认情况下没有人为你的情况优化: - )

但是,我相信大多数编译器都有命令行参数,您可以使用这些参数强制它们优化空间 - 您可能希望使用该设置检查结果。

这是more details on the EXE file formats

答案 1 :(得分:4)

事实证明,我之前应该能够猜到这一点......答案是调试符号和代码;那些占据了大部分空间。不使用/ DEBUG和/ PDB进行编译(默认情况下我总是这样做)将13 K降低到3 K.