【问题标题】:COMDAT section placement in the executableCOMDAT 部分在可执行文件中的位置
【发布时间】:2013-07-09 19:19:58
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 您是否为此项目启用了“编辑并继续”?
  • 点了。将 /ZI 替换为 /Zi,COMDAT 消失了。给个答案,我会接受的。

标签: visual-c++ linker


【解决方案1】:

如果您为项目启用了“编辑并继续”,则会引入您所看到的填充,以便编译器和链接器可以修补可执行映像,而不必重新构建和重新链接它。

【讨论】:

    猜你喜欢
    • 2014-04-18
    • 2016-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多