При компиляции:
// external definitions
int value1 = 0;
static int value2 = 0;
gcc-компилятор генерирует следующую сборку:
.globl value1
.bss
.align 4
.type value1, @object
.size value1, 4
value1:
.zero 4
.local value2
.comm value2,4,4
Однако, когда я инициализирует переменные значением, отличным от нуля, например:
// external definitions
int value1 = 1;
static int value2 = 1;
gcc-компилятор сгенерировал следующее:
.globl value1
.data
.align 4
.type value1, @object
.size value1, 4
value1:
.long 1
.align 4
.type value2, @object
.size value2, 4
value2:
.long 1
Мои вопросы:
- Почему в первом случае значения выделяются в сегменте bss, а во втором - в сегменте данных.
- Почему переменная value2 определяется как .local и .comm в первом случае, а не во втором.