Windows上的LinkOnceODRLinkage用于全局变量

时间:2018-11-14 23:46:52

标签: windows linker llvm

我正在用clang 6.0编译两个文件:testA.ctestB.c

在这两个文件上,我正在运行一个自定义编译器通道,该通道将插入称为globalVarTest的零初始化全局变量。我将此类全局变量的链接设置为LinkOnceODRLinkage

现在,当我将testA.ctestB.c链接在一起时(即,通过分别编译它们而获得的目标文件),链接器会抱怨globalVarTest有多个定义。

LinkOnceODRLinkage是否不应该告诉链接程序,如果两个定义都匹配,则符号相同,因此在构建最终可执行文件时可以选择两个定义中的任何一个吗?

更新: 相同的过程在Linux上也适用。这是Windows链接程序的限制吗?我已经可以使用COMDAT部分实现相同的效果,但是我想知道为什么LLVM在没有我需要显式设置COMDATS的情况下不会自动使用该机制。

1 个答案:

答案 0 :(得分:0)

我从LLVM邮件列表中得到了答案。即使过去曾经使用LinkOnceODRLinkage在Windows上也无法使用。

达到相同效果的最佳方法是显式使用COMDAT节。显然,这是通过设置LinkOnceODRLinkage自动发生的,直到行为改变为止。