COMDAT部分名称

时间:2014-03-13 16:11:21

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

我正在为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来自哪里?或者,如果它只是一个指向该部分的常规符号,如果有几个不同的符号指向它,会发生什么?

1 个答案:

答案 0 :(得分:2)

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

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