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