为什么在尝试将两个仅在初始化值不同的(RAM)变量放入同一部分时会出现编译器错误?
问题
C源:
int __attribute__((section(".in_my_data"))) _foo = 1;
int __attribute__((section(".in_my_data"))) _bar = 0;
(相关的)GCC编译器输出:
mcve/main.c:75:45: error: _bar causes a section type conflict
链接器脚本在定义中包含以下行SECTIONS
,但(致命)错误来自编译器,而不是链接器。
.my_data : { *(.in_my_data) } > data
更多信息
更改 C 源代码以允许编译器使用两个节允许编译通过,但如果两个输入节映射到同一个输出节,则链接器会生成错误。
C源:
int __attribute__((section(".in_my_data_nonzero"))) _foo = 1;
int __attribute__((section(".in_my_data_zero"))) _bar = 0;
链接器脚本:
.my_data : { *(.in_my_data*) } > data
(相关)链接器输出:
Link Error: attributes for input section '.in_my_data_nonzero' conflict
with output section '.my_data'
在 C 源代码中交换行的顺序只会改变哪个部分(出现在 C 源代码中的第二个)是错误的。
问题
对于以零初始化的变量,对于以非零初始化的变量,GCC 编译器需要哪些属性,反之亦然?
编译器是否试图将初始化为零的变量放在该.bss
部分中,而不是.data
用于初始化数据的部分?或者是否有另一部分用于初始化为零的数据?
相关问题
出现的类似问题涵盖了内存类型(ROM 与 RAM)之间的冲突问题:
...或将初始化const
数据放入 NOLOAD 输出部分:
... 或者对于原因仍然是一个谜,并且可能与此有关:
据我所知,以上任何一个似乎都没有我可以在这个问题上申请的答案。