Неинициализированные переменные объектного файла не отображаются в команде размера linux

Создан исходный файл test1.c со следующим кодом:

#include<stdio.h>
#include<stdlib.h>

int x = 15;
int d = 15;
int m = 18;
int k = 0;
int c = 0;
int l;

int main()
{
    int y = 5;
    int ma = 10;
    int am = 10;
    printf("Hello World\n");
    return 0;
}

Скомпилировал следующий код с помощью команды:

gcc -c test1.c

Для проверки размера различных сегментов памяти используется команда size:

size test1.o

Вывод, который я получил:

   text    data     bss     dec     hex  filename
   114       12       8     134      86   test1.o

И я обнаружил, что всякий раз, когда я добавляю глобальную неинициализированную переменную, такую ​​как int l выше, сегмент bss остается неизменным. Сегмент bss показывает только те переменные, которые инициализированы в 0. Но согласно определению сегмент bss должен содержать неинициализированные переменные.

Также всякий раз, когда я добавляю инициализированный глобальный указатель, такой как:

int *p = &x

это увеличивает размер сегмента данных на 12, а не на 8 (это размер целочисленного указателя на моем компьютере).

Что не так с моей интерпретацией?

1 ответ

И я обнаружил, что всякий раз, когда я добавляю глобальную неинициализированную переменную, такую ​​как int l выше, сегмент bss остается неизменным.

Это ожидаемое поведение. Цитата из статьи в Википедии (выделение MIME)

[...] Поскольку сегмент BSS содержит только переменные, которые еще не имеют никакого значения, на самом деле нет необходимости хранить изображение этих переменных. Размер, который потребуется BSS во время выполнения, записывается в объектном файле, но BSS (в отличие от сегмента данных) не занимает фактического пространства в объектном файле.

Таким образом, вряд ли размер для bss будет меняться при изменении числа неинициализированных переменных со статическим хранилищем. Вы можете обратиться к этому более раннему ответу для более подробной информации о части " почему".

Другие вопросы по тегам