【问题标题】:Why does an EXE file that does *nothing* contain so many dummy zero bytes?为什么 *nothing* 的 EXE 文件包含这么多虚拟零字节?
【发布时间】:2011-01-05 09:46:07
【问题描述】:

我已经编译了一个完全不执行任何操作的 C 文件(只是一个返回的 main... 甚至没有打印“Hello, world”),并且我已经使用各种编译器(MinGW GCC, Visual C++、Windows DDK 等)。它们都与标准的 C 运行时链接。

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

谢谢!

【问题讨论】:

  • 假设是 Windows 环境,如果您愿意做一些推断,以下相当直接地回答了您的问题:support.microsoft.com/kb/65122
  • @jleedev:我没有使用 ELF,但我确实觉得这很有趣,谢谢! @Cody:我不确定这如何回答我的问题——如果这些是必需的条目,那么为什么它们会导致代码中间出现 0xCC 字节?可执行文件中的标头不大于 1-2 KB(我之前创建过具有这些大小的 EXE,因此标头显然更小),所以我不确定这如何回答我的问题。
  • 如果您有兴趣,我自己找到了答案。 :)
  • 您可能也对 Matt Pietrek 的这篇旧文章感兴趣,尽管我不确定今天仍有多少相关/准确:microsoft.com/msj/archive/s572.aspx

标签: c null executable exe zero


【解决方案1】:

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

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

不过,由于可执行文件通常应该做一些事情(即它们的代码和数据段确实包含有用的东西),而且存储很便宜,默认情况下没有人会针对您的情况进行优化 :-)

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

这里是more details on the EXE file formats

【讨论】:

  • 呃...不准确:我刚刚创建了一个 3 KB 的可执行文件,显然违反了 8K 大小的猜测。不过,否则很好的答案; +1。
  • @Lambert,我并不是说必须有最小大小限制,或者它必须是 8K - 它只是一个说明性猜测(可能甚至在某些具有某些设置的环境中适用于某些编译器:-)
  • 啊,好吧。我很早就排除了这种猜测,因为我使用不同的编译器进行了尝试并得到了相同的结果,并且因为数据不仅仅是 0x00,它也是 0xCC——一个非典型的填充字节。不过谢谢你的猜测! :)
【解决方案2】:

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

【讨论】:

  • +1 关于调试信息的好处——我什至没有想到 :-)
猜你喜欢
  • 1970-01-01
  • 2012-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-02
  • 2015-10-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多