6

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

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

谢谢!

4

2 回答 2

10

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

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

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

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

这是有关 EXE 文件格式的更多详细信息

于 2011-01-05T09:50:01.290 回答
5

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

于 2011-01-05T19:36:09.433 回答