LINUX.ORG.RU

В ней находятся все неинициализированные данные. Фактически это тот же сегмент данных. А оформленн он приблизительно так:

... SECTIONS { __begin_bss = .; .bss : { *(.bss) } __end_bss = .; }

То есть в начале и в конце определены симболы начала и конца. Это нужно для того, чтобы код (который чаще всего пишется на asm) находящийся в /usr/lib/crt1.o смог найти начало и конец этой секции и заполнить ее нулями. Приблизительно так:

extern char __begin_bss; extern char __end_bss;

char *addr = NULL; for (addr = &__begin_bss; addr < &__end_bss; addr++) *addr = '\0';

Вот и все его назначение.

Так что можно смело оставлять глобальные переменные не инициализированными.

Banshee
()

Поправка. addr++ будет увеличивать addr на sizeof(char *). А нужно двигаться по байтно.

Banshee
()

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

anonymous
()

Да. У секции .bss в объектнике поставлен только размер, данных для неё объектник не содержит. При загрузке под неё выделяется память и заполняется нулями. Используется для экономии места в бинарниках.

justme
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.