Неоднозначное поведение.сегмент bss в программе C

Я написал простую программу C (test.c) ниже: -

#include<stdio.h>
int main()
{
   return 0;
}

и выполнил follwing, чтобы понять изменения размера .сегмент bss.

gcc test.c -o test
size test

выход вышел как: -

   text    data     bss     dec     hex filename
   1115     552       8    1675     68b test

Я ничего не объявлял глобально или статической области. Поэтому, пожалуйста, объясните, почему размер сегмента bss составляет 8 байт.

Я сделал следующее изменение: -

#include<stdio.h>
int x;    //declared global variable
int main()
{
   return 0;
}

но, к моему удивлению, выход был таким же, как предыдущий: -

   text    data     bss     dec     hex filename
   1115     552       8    1675     68b test

Пожалуйста, объясните. Затем я инициализировал глобальный: -

#include<stdio.h>
int x=67;    //initialized global variable
int main()
{
   return 0;
}

размер сегмента данных увеличился, как ожидалось, но я не ожидал, что размер сегмента bss уменьшится до 4 (в отличие от 8, когда ничего не было объявлено). Пожалуйста объяснить.

text       data     bss     dec     hex filename
1115        556       4    1675     68b test

Я также попробовал comands objdump и nm, но они тоже показали переменную x занимающую .bss (во 2-м случае). Однако, никакое изменение в размере bss не показано на команде размера.

I следовали процедуре по: http://codingfox.com/10-7-memory-segments-code-data-bss/ где выходы приходят совершенно как ожидалось.

2 ответов


при компиляции простой main программа вы также связываете код запуска. Этот код отвечает, среди прочего, за init bss.

этот код-это код, который" использует " 8 байтов, которые вы видите .секция bss.

вы можете удалить этот код, используя -nostartfiles опция gcc:

-nostartfiles

не используйте стандартные файлы запуска системы при связывании. Стандартные системные библиотеки используются нормально, если не используется-nostdlib или-nodefaultlibs

чтобы сделать тест, используйте следующий код

#include<stdio.h>

int _start()
{
   return 0;
}

и скомпилировать его с

gcc -nostartfiles test.c

вы увидите .bss установлен в 0

   text    data     bss     dec     hex filename
    206     224       0     430     1ae test

ваши первые два фрагмента идентичны, так как вы не используете переменную x.

попробуй такое

#include<stdio.h>
volatile int x;
int main()
{
   x = 1;
   return 0;
}

и вы должны увидеть изменения в .bss размер.

обратите внимание, что эти 4/8 байта являются чем-то внутри кода запуска. Что это такое и почему он варьируется по размеру, невозможно сказать, не копаясь во всех деталях упомянутого кода запуска.