为什么gcc将一个大的常量数组放到" .rwdata"部分而不是" .rodata"部分?

时间:2014-11-07 08:14:43

标签: c gcc linaro

/* 0xFFFFFFFF * 256*/
#define test_256X0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, ... 0xFFFFFFFF

编译完成后,const数组放在" .rwdata"部分而不是" .rodata"部分,我不知道为什么。

谷歌搜索stackoverflow网站后,没有指定的答案。有没有人知道为什么或如何要求编译器(或链接器)在"将常数数据放入非只读部分时输出警告信息"?感谢。

PS。我通过添加 attribure 来解决我的问题(((" .rodata"))

__attribure__((section(".rodata"))) volatile const int TEST_ro[512] = {test_256X, test_256X};

PS。我使用linaor-gcc编译器来实现arm core

1 个答案:

答案 0 :(得分:1)

答案:  如果我希望变量“易变”并放在只读部分,请使用

__attribure__((section(".rodata"))) /* default read-only data section*/

是最好的方式。

参考:

  1. 这不是什么挥发性的。它向编译器指示内存可能异步更改,因此它不使用缓存结果。它与const不一致。尝试使用static告诉编译器其他模块无法访问它。 - luser droog

  2. 如果要将变量放置到特定部分,则使用显式部分放置是可行的方法。 C标准为此提供了非常有限的工具集,因此您将受编译器提供的支配。 属性并不漂亮,但最有可能的是你需要做的事情。