Что из приведенного будет в .bss секции данных?

Что в данном примере будет храниться в секции неинициализированных данных (bss)?

int a;
int arr[20];

int main(){}

Попробую высказать свои предложения: а будет инициализирована нулём, ибо имеет статическую продолжительность хранения и попадет в data сегмент. Но что насчёт массива, где будет лежать он?


Ответы (1 шт):

Автор решения: Fat-Zer

/*Нудные оговорки:*/
Строго говоря, С++ ничего не говорит про секции данных — это понятия уровня конкретной платформы и линкера, так что: а) вопрос не имеет смысла в отрыве от платформы б) компилятор волен сделать всё как считает нужнsv.


Все переменные со статическим сроком хранения (и tread_local) не снабжённые явной константной инициализацией (constant-initialized) инициализируются изначально нулями (zero-initialized). При этом для составных типов (структуры/классы, объединения или массивы) данных каждый их член также инициализируется нулём (для объединений немного по-другому это сформулировано, но сути это не меняет).

Обычно компиляторы помещают все нулевые объекты в секцию .bss. При этом не важно вызвано это явной инициализацией нулём или нет. Так что в примере выше, скорей всего, оба объекта (a и arr) будут находится в секции .bss. Это не сложно проверить:

alexander@goblin /tmp $ cat foo.cpp
int a;
int arr[20];

int main(){}
alexander@goblin /tmp $ gcc foo.cpp
alexander@goblin /tmp $ objdump -t a.out

a.out:     формат файла elf64-x86-64

SYMBOL TABLE:
# ...
0000000000004060 g     O .bss   0000000000000004              a
0000000000004028 g       .bss   0000000000000000              __bss_start
0000000000001125 g     F .text  000000000000000b              main
0000000000004080 g     O .bss   0000000000000050              arr
# ...
→ Ссылка