Я всегда считал, что GCC помещает переменную static const
в сегменты .rodata
(или в .text
сегменты для оптимизации) ELF или такого файла. Но это не так.
В настоящее время я использую gcc (GCC) 4.7.0 20120505 (prerelease)
на ноутбуке с GNU/Linux. И он ставит постоянную переменную в сегмент .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;
}
Итак, это ошибка или функция? Я решил записать это как ошибку для bugzilla, но лучше сначала обратиться за помощью.
Есть ли какие-либо причины, по которым GCC не может разместить константную переменную в .rodata
?
ОБНОВЛЕНО:
Как проверено, постоянная переменная с явной инициализацией (например, const int a = 0;
) будет помещена в .rodata
GCC, а я оставил переменную неинициализированной. Таким образом, этот вопрос может быть закрыт позже - я не представил правильного вопроса.
Кроме того, в моих предыдущих словах я написал, что переменная a помещается в раздел .data, что неверно. Он фактически помещается в раздел .bss
, так как не инициализирован. Текст, указанный выше, исправлен.