我一直认为GCC会将static const
变量放置在ELF文件的.rodata
段(或者出于优化考虑,放置在.text
段)。但实际情况似乎并非如此。
我目前正在一台运行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的bug,但最好先寻求帮助。
是否有任何原因导致GCC无法将const变量放置在.rodata
中?
更新:
经过测试,具有显式初始化(如const int a = 0;
)的常量变量将被GCC放置在.rodata
中,而我未对变量进行初始化。因此,这个问题可能会被关闭 - 我没有提出正确的问题。
另外,在我之前的话中,我写道变量a被放置在'.data'部分,这是不正确的。实际上,由于未初始化,它实际上被放置在.bss
部分。现在上面的文本已经更正。
const
变量。但我检查了一下,GCC在C模式下不允许这样的扩展。 - Potatoswatterstatic
关键字的对象),在 C 中使用非常量初始化器是完全合法的,例如const int r = rand();
。但是对于静态对象,不允许使用非常量初始化器。const
的存在或不存在并不重要;在 C 中,const
意味着“只读”,而不是“常量”。 - Keith Thompson