COMDAT与BSS定义

时间:2014-03-17 15:53:29

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

在编译和链接C代码与Microsoft编译器时,不同目标文件中具有相同名称的定义根据定义的类型有几种可能的结果。

int x[5] = {1};
int x[5] = {1};

两个初始化数据定义;这是一个错误。

int x[5];
int x[10];

两个BSS定义。较大的一个获胜,较小的一个被丢弃,结果就好像只有较大的定义存在。

int x[5] = {1};
int x[10];

初始化数据定义和BSS定义。即使数据定义较小,数据定义也会获胜,并且丢弃BSS定义。

我的问题是,除了初始化的数据定义是COMDAT之外,如果你遇到第三种情况怎么办?即使更大,BSS定义是否仍然被丢弃?或者它取决于COMDAT选择字段,例如BSS定义只会在IMAGE_COMDAT_SELECT_LARGEST的情况下获胜,而数据定义在其他情况下获胜吗?​​

(我假设弱外部定义将被BSS定义覆盖,无论大小如何;如果不是这样,请纠正我。)

1 个答案:

答案 0 :(得分:0)

每次使用Microsoft链接器进行实验时,COMDAT初始化定义仍然会获胜,并且即使更大,也会丢弃相应的BSS定义。我不知道是否有任何异国情调的旗帜会改变这个结果。