【发布时间】:2016-01-13 03:08:47
【问题描述】:
我在 Windows 8.1 64 位上使用 Dev-C++,它使用 GCC 编译。
我注意到我的所有 .c 文件总是编译为至少 128 KB 的 .exe 文件,无论源文件多么小。即使是简单的“你好,世界!”是128kb。正如我所料,具有更多代码行的源文件增加了可执行文件的大小,但所有文件开始时至少 128kb,好像这是某种最小大小。
我知道 .exe 实际上并没有这样的最小大小; .kkrieger 是一个完整的第一人称射击游戏,具有 3D 图形和声音,所有这些都可以放在一个 96kb 的可执行文件中。
为了弄清楚这一点,我在 Notepad++ 中打开了我的 hello_world.exe。我想,也许我的编译器添加了一个恰好为 128kb 的冗长标头。
不幸的是,我对可执行文件知之甚少,无法理解它,尽管我确实发现诸如“地址 %p 没有图像部分 VirtualQuery failed for %d bytes at address %p”之类的字符串隐藏在其中.exe 中常见的乱码。
当然,这不是一个严重的问题,但我想知道为什么会这样。
为什么会出现这个 128kb 的最小值?这是否与我的 64 位操作系统有关,或者可能与我的编译器的怪癖有关?
【问题讨论】:
-
无论原始源代码是什么,每种文件格式都会有一些始终存在的内容。此外,您可能正在查看包含调试符号的二进制文件。如果是这种情况,那么您可以将其剥离以使其更小。 “带有 3D 图形和声音,都适合一个 96kb 的可执行文件”。您查看的 exe 中不太可能包含所有代码。它将使用可能非常大的 dll(共享库)。
-
@kaylum - 实际上,不管你信不信,.kkrieger 实际上是静态链接的。 .kkrieger 使用的唯一外部 DLL 是来自 windows 的
wgl相关函数(Win32 中的所有图形都需要)。它只是广泛地使用程序生成。纹理是从可执行文件中压缩的,产生打包成几个字节的整个纹理网格。声音只是一个不断输入 MIDI 数据的 DSP 输出流,这意味着它们可以将整个声音引擎打包成几个字节的内联汇编。很整洁的东西,对吧? -
@MasonWatmough 哇,是的,很酷。对于 OP 了解用于产生小二进制结果的长度也是很好的信息。
标签: c compilation executable