При проверке разборки объектного файла через readelf я вижу, что данные и сегменты bss содержат одинаковый адрес смещения. Раздел данных будет содержать инициализированные глобальные и статические переменные. BSS будет содержать неинициализированные глобальные и статические переменные.
1 #include<stdio.h>
2
3 static void display(int i, int* ptr);
4
5 int main(){
6 int x = 5;
7 int* xptr = &x;
8 printf("\n In main() program! \n");
9 printf("\n x address : 0x%x x value : %d \n",(unsigned int)&x,x);
10 printf("\n xptr points to : 0x%x xptr value : %d \n",(unsigned int)xptr,*xptr);
11 display(x,xptr);
12 return 0;
13 }
14
15 void display(int y,int* yptr){
16 char var[7] = "ABCDEF";
17 printf("\n In display() function \n");
18 printf("\n y value : %d y address : 0x%x \n",y,(unsigned int)&y);
19 printf("\n yptr points to : 0x%x yptr value : %d \n",(unsigned int)yptr,*yptr);
20 }
вывод:
SSS:~$ size a.out
text data bss dec hex filename
1311 260 8 1579 62b a.out
Здесь, в приведенной выше программе, у меня нет неинициализированных данных, но BSS занял 8 байтов. Почему он занимает 8 байтов? Также, когда я разбираю объектный файл,
EDITED :
[ 3] .data PROGBITS 00000000 000110 000000 00 WA 0 0 4
[ 4] .bss NOBITS 00000000 000110 000000 00 WA 0 0 4
[ 5] .rodata PROGBITS 00000000 000110 0000cf 00 A 0 0 4
data, rodata и bss имеют одинаковый адрес смещения. Означает ли это, что родата, данные и bss относятся к одному и тому же адресу? Содержат ли раздел "Данные", "Родата" и "BSS" значения данных в одном и том же адресе, если да, то как отличить раздел "Данные", "BSS" и "Родата"?