Неинициализированные переменные объектного файла не отображаются в команде размера 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
будет меняться при изменении числа неинициализированных переменных со статическим хранилищем. Вы можете обратиться к этому более раннему ответу для более подробной информации о части " почему".