【发布时间】:2014-04-13 16:06:04
【问题描述】:
我正在为 Windows PE 格式的目标文件编写一个链接器,我已经到了可以将 Microsoft 编译器生成的目标文件链接在一起的阶段,但是当我尝试与 libcmt.lib 链接时,我得到了一个很多重复的符号。
例如,cosl 由库中的三个不同对象定义。这三个都指不同地方的定义,并且所有三个看起来都是真实的,例如它们指向名为 .text$mn 的文本段,并具有存储类 IMAGE_SYM_CLASS_EXTERNAL。
这些是替代版本,链接器应该根据某些标准选择一个,还是我误解了 PE 库格式的语义?
【问题讨论】:
-
我假设您已验证在使用常规编译器工具进行编译/链接时没有收到“重复符号”错误,以确保这是您的链接器代码的问题?
-
@Devolus 是的,Microsoft 链接器工作正常。
-
偏移量是否也指向不同的对象?
-
粗略的猜测是您没有正确处理 COMDAT 部分,被 cosl() 等内联函数使用。阅读pecoff specification 的第 5.5.6 节。
-
@HansPassant 是的,我想就是这样。谢谢!
标签: c windows visual-c++ linker portable-executable