当通过readelf
检查目标文件的反汇编时,我发现data
和bss
段包含相同的偏移地址。 data
部分将包含初始化的全局和静态变量。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个字节? 当我反汇编对象文件时,
[ 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
具有相同的偏移地址。这是否意味着rodata
、data
和bss
引用相同的地址?
数据段、只读数据段和BSS段是否包含相同地址中的数据值,如果是,如何区分数据段、BSS段和只读数据段?
(void*)
类型。 - Jensdata
和bss
部分都来自库。 - Michael Burr