GCC: почему постоянные переменные не помещаются в .rodata

Я всегда считал, что 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, так как не инициализирован. Текст выше теперь исправлен.

23
задан starrify 15 September 2014 в 15:00
поделиться