Visual C++ 项目,Wintel-32。我有一个 C 文件,它被编译为对象然后链接,非常普通的设置。调试配置。
当我用 来检查目标文件时dumpbin /symbols
,它告诉我我的目标文件有许多代码(“COMDAT”)部分——似乎每个函数一个。它们都被命名为.text
,链接器会将它们合并到最终可执行文件中的一个大的 .text 部分中。
在项目设置中禁用功能级链接。我什至不确定为什么首先会生成 COMDAT。
但是我在调试器中注意到那些 OBJ 级别的部分(函数)在可执行文件中并没有连续运行。在它们之间有一些填充 - 几十个字节的int 3
指令 - 显然是控制不应该去的死空间。函数边界全部按 16 个字节对齐,但还有更多事情要做——这不仅仅是按 16 个字节对齐,或者在大多数情况下填充会少得多。它通常约为 20-40 字节,但我看到了一些异常值 - 这里填充 11 个字节,那里填充 73 个。
这与链接器的 /ALIGN 选项无关 - 它处理正确的部分。它的默认值是 4K,绝对不是我们这里的。
为什么这个填充?它的大小的算法是什么(绝对不仅仅是对齐)?