对象符号覆盖库符号?

时间:2014-03-14 11:30:26

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

当您在两个不同的C源文件中定义相同的函数(非静态)时,编译它们并将它们与Microsoft链接器链接,您会得到重复的符号错误消息,如预期的那样。

另一方面,当您定义一个与标准库函数的名称匹配的函数时,例如cos定义为COMDAT)然后没有错误;您的定义将以静默方式覆盖标准库定义。这也是理想的行为,但我试图找出确切的规则是什么。

目标文件中定义的规则符号是否覆盖库文件中定义的符号'或者是其他东西?我在PE规范中找不到这一点,但也许我忽视了一些事情。

1 个答案:

答案 0 :(得分:1)

MS链接器仅链接解析依赖关系所需的静态库中的那些成员对象。来自静态库的未使用的成员对象被优化掉。因此,如果静态库成员对象中有重复的符号,但不需要成员对象,则不会出现错误。也可以看看: http://msdn.microsoft.com/en-us/library/72zdcz6f.aspx

似乎MS链接器也支持某种弱符号: http://support.microsoft.com/kb/148652/EN-US http://nikoniko-programming.blogspot.ch/2010/09/aliasing-symbol-names-during-link-time.html

但我在MSDN中找不到这个。