0

Visual C++ 项目,Wintel-32。我有一个 C 文件,它被编译为对象然后链接,非常普通的设置。调试配置。

当我用 来检查目标文件时dumpbin /symbols,它告诉我我的目标文件有许多代码(“COMDAT”)部分——似乎每个函数一个。它们都被命名为.text,链接器会将它们合并到最终可执行文件中的一个大的 .text 部分中。

在项目设置中禁用功能级链接。我什至不确定为什么首先会生成 COMDAT。

但是我在调​​试器中注意到那些 OBJ 级别的部分(函数)在可执行文件中并没有连续运行。在它们之间有一些填充 - 几十个字节的int 3指令 - 显然是控制不应该去的死空间。函数边界全部按 16 个字节对齐,但还有更多事情要做——这不仅仅是按 16 个字节对齐,或者在大多数情况下填充会少得多。它通常约为 20-40 字节,但我看到了一些异常值 - 这里填充 11 个字节,那里填充 73 个。

这与链接器的 /ALIGN 选项无关 - 它处理正确的部分。它的默认值是 4K,绝对不是我们这里的。

为什么这个填充?它的大小的算法是什么(绝对不仅仅是对齐)?

4

1 回答 1

1

如果您为项目打开了 Edit & Continue,则会引入您所看到的填充,以便编译器和链接器可以修补可执行映像,而不必重新构建和重新链接它。

于 2013-07-09T20:20:53.137 回答