gpt4 book ai didi

COMDAT 与 BSS 定义

转载 作者:行者123 更新时间:2023-11-30 17:37:14 25 4
gpt4 key购买 nike

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

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 定义覆盖;如果情况并非如此,请纠正我。)

最佳答案

根据 Microsoft 链接器的实验,COMDAT 初始化的定义仍然获胜,并且即使较大,相应的 BSS 定义也会被丢弃。我不知道是否有任何外来标志会改变这个结果。

关于COMDAT 与 BSS 定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22459043/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com