【发布时间】:2015-05-06 12:37:06
【问题描述】:
为什么在尝试将两个仅在初始化值不同的 (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)之间的冲突问题:
- "Section type conflict" in arm embedded, what is it?
- How do I resolve a "section type conflict" compile error and best practices for using section attribute with gcc
- Getting a "section type conflict" using M2tklib and glcd
... 或将初始化的const 数据放入 NOLOAD 输出部分:
...或者对于原因仍然是个谜,可能与此有关:
据我所知,上述任何一个问题似乎都没有我可以应用于此问题的答案。
【问题讨论】:
-
可能是愚蠢的问题,但您是否尝试过切换这两行?
-
其他(非 SO)论坛上有类似的帖子,几乎都与尝试将 RAM 变量放入 ROM 中有关。
-
@Eregrith 是的。结果相同。我还尝试了多个具有零值和非零值的变量。编译器开始工作的第一个(当然),与第一个具有相同(零或非零)值的所有其他值一样。 IE。如果我在最后添加
int __attribute__((section(".in_my_data"))) _baz = 1;,_baz很好,但如果_baz=0;那么_baz也会失败。 -
如果第一个是
int __attribute__((section(".in_my_data"))) _foo = 0;是否都失败了? -
@Eregrith 如果
_foo = 0;那么_bar = 0;可以,但_baz = 1;失败。看来编译器已经决定 crt_startup 将负责初始化= 0;变量,并希望将它们放在与= non-zero;变量不同的部分中。