gpt4 book ai didi

c - GCC:为什么常量变量没有放在 .rodata 中

转载 作者:IT王子 更新时间:2023-10-28 23:29:22 25 4
gpt4 key购买 nike

我一直相信 GCC 会将 static const 变量放置到 .rodata 段(或放置到 .text 段以进行优化)的 ELF 或此类文件。但好像不是这样的。

我目前在装有 GNU/Linux 的笔记本电脑上使用 gcc (GCC) 4.7.0 20120505 (prerelease)。它确实在 .bss 段中放置了一个静态常量变量:

/*
* this is a.c, and in its generated asm file a.s, the following line gives:
* .comm a,4,4
* which would place variable a in .bss but not .rodata(or .text)
*/
static const int a;

int main()
{
int *p = (int*)&a;
*p = 0; /* since a is in .data, write access to that region */
/* won't trigger an exception */
return 0;
}

那么,这是错误还是功能?我决定将此作为 bug 提交给 bugzilla,但最好先寻求帮助。

GCC 不能在 .rodata 中放置 const 变量有什么原因吗?

更新:

经过测试,一个具有显式初始化的常量变量(如 const int a = 0;)将被 GCC 放入 .rodata 中,而我留下了该变量未初始化。因此,这个问题可能会在稍后关闭——我可能没有提出正确的问题。

另外,在我之前的文章中,我写到变量 a 被放置在 '.data' 部分,这是不正确的。由于未初始化,它实际上已放入 .bss 部分。上面的文字现在已经更正了。

最佳答案

编译器使它成为一个通用的,它可以与其他兼容的符号合并,如果它最终没有显式初始化定义,它可以进入 bss(不占用磁盘空间)。将其放入 rodata 将是一种权衡;您会在运行时节省内存(提交费用),但会使用更多磁盘空间(对于一个巨大的数组来说可能很多)。

如果您希望它进入 rodata,请使用 GCC 的 -fno-common 选项。

关于c - GCC:为什么常量变量没有放在 .rodata 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10818761/

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