COMDAT部分放置在可执行文件中

时间:2013-07-09 19:19:59

标签: visual-c++ linker

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

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

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

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

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

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

1 个答案:

答案 0 :(得分:0)

如果您有编辑&为项目继续打开,引入了您正在看到的填充,因此编译器和链接器可以修补可执行映像,而不必重建和重新链接它。