causes a section type conflict"-6ren"> causes a section type conflict"-为什么在尝试将两个 (RAM) 变量(仅初始化值不同)放入同一部分时会出现编译器错误? 问题 C 源代码: int __attribute__((section(".in_my_data"))) _f-6ren">
gpt4 book ai didi

c - 海湾合作委员会错误 " causes a section type conflict"

转载 作者:太空狗 更新时间:2023-10-29 17:07:38 32 4
gpt4 key购买 nike

为什么在尝试将两个 (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 输出部分:

... 或成因仍是个谜,可能与以下因素有关:

据我所知,以上似乎都没有我可以应用于此问题的答案。

最佳答案

默认情况下,GCC 将对象的类放在不同的部分,可执行代码到 .text,初始化数据到 .data,静态数据到 .bss,还有一些更晦涩的。

如果您试图强制两个不同类的对象属于同一部分,GCC 将引发此部分错误。

解决方案是将它们放在不同的部分,最后,告诉链接器最终将这些对象合并在同一个部分,例如:

.boot : {                 // target ELF section will contain....
*(.boot) // executable code
*(.boot_rodata) // constant data
*(.boot_bss) // static data
} > BOOT // to finally be place in this area

关于c - 海湾合作委员会错误 "<variable> causes a section type conflict",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30076949/

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