c - 为什么*什么都不做*的 EXE 文件包含这么多虚拟零字节?

标签 c null executable exe zero

我编译了一个什么都不做的 C 文件(只是一个返回的 main... 甚至没有打印“Hello, world”),我用各种方法编译了它编译器(MinGW GCC、Visual C++、Windows DDK 等)。它们都与标准的 C 运行时链接。

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

谢谢!

最佳答案

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

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

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

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

这里是 more details on the EXE file formats .

关于c - 为什么*什么都不做*的 EXE 文件包含这么多虚拟零字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4602643/

相关文章:

c - 打印无符号数组并退出循环

c - 动态分配用户输入的字符串

c - 结构中的枚举,C中不完整元素的编译错误

javascript - 将 AppJS 项目制作成单个 exe

delphi - Delphi 中的时间戳 (%d) 相当于什么?

.net - 如何在 .net 中创建可执行文件

c - 如何在考虑性能的情况下最好地用C编写体素引擎

c# - 如何处理int类型的session变量中的null

ios - 重新启动 objective-c 中的对象 - Matchismo 作业 2 - 重新启动游戏

java - IntelliJ Idea + JavaFX = class.getResource() 返回 null