В коде C любая переменная со статической продолжительностью хранения определяется как инициализируемая в 0 спецификацией (Раздел 6.7.8 Инициализация, параграф 10):
Если объект со статической продолжительностью хранения не инициализирован явно, то:
- если он имеет тип указателя, он инициализируется нулевым указателем;
- если он имеет арифметический тип, он инициализируется нулевым (положительным или без знака);
- если это агрегат, каждый элемент инициализируется (рекурсивно) в соответствии с этими правилами;
- если это объединение, первый именованный элемент инициализируется (рекурсивно) в соответствии с этими правилами.
Некоторые загрузчики программ заполняют весь раздел нулями для начала, а другие заполняют его «по требованию» в качестве улучшения производительности. Таким образом, хотя вы технически правы, что раздел .bss
не может на самом деле содержать все нули, когда код C начинает выполняться, он логически делает. В любом случае, если у вас есть стандартный совместимый набор инструментов, вы можете думать, что он равен нулю.
Любые переменные, которые инициализируются ненулевыми значениями, никогда не попадут в раздел .bss
; они обрабатываются в секциях .data
или .rodata
, в зависимости от их конкретных характеристик.