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