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