Локальные и статические переменные в C

При компиляции этого:

// 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 в первом случае, а не во втором.

Ответы на вопрос(3)

Ваш ответ на вопрос