【问题标题】:COMDAT section nameCOMDAT 部分名称
【发布时间】:2014-04-18 12:47:36
【问题描述】:

我正在为 Windows 二进制文件编写一个链接器,目前正在实现 COMDAT。我想我了解大部分规范,除了 COMDAT 节的三个记录(节标题、节符号和辅助符号)之外,规范似乎没有提到存储在其中的任何一个中的通用名称。

换句话说,当我在这样一个对象上运行 dumpbin 时,它会给出如下输出:

SECTION HEADER #8
.text$mn name
       0 physical address
       0 virtual address
       5 size of raw data
    2358 file pointer to raw data (00002358 to 0000235C)
    235D file pointer to relocation table
       0 file pointer to line numbers
       1 number of relocations
       0 number of line numbers
60301020 flags
         Code
         COMDAT; sym= cosl

最后一项sym= cosl 来自哪里?或者如果它只是一个指向该部分的常规符号,如果有几个不同的此类符号指向它会发生什么?

【问题讨论】:

    标签: windows visual-c++ linker portable-executable comdat-folding


    【解决方案1】:

    根据Microsoft PE and COFF Specification,第 4.5.6 节(如果您正在编写链接器,我相信您已经仔细阅读过),sym= 值是 COMDAT 符号,它链接器与 Selection 值一起使用来确定要在最终图像中保留 COMDAT 部分的哪个副本。每个 COMDAT 部分的符号表中有两个条目。第一个具有部分名称和带有选择信息的辅助记录。 COMDAT 符号值来自 COMDAT 部分的符号表中的第二个条目。它要么是符号的 ShortName 值,要么是它指向的字符串表条目的值。

    对于要链接的各种目标文件中相同 COMDAT 的所有副本,COMDAT 符号值应该相同。如果我正确理解规范,则任何一个目标文件中的特定 COMDAT 部分都应该只有两个符号表条目具有匹配的 SectionNumber。您不应将具有不同值的多个 COMDAT 符号字符串视为单个 COMDAT 的符号表条目。

    【讨论】:

    • 啊,我想你是对的,符号数量少于或多于两个的情况似乎是我可以忽略的调试信息。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-25
    • 1970-01-01
    • 2012-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多