Linux目標文件五個段
Linux下編譯后生成的目標文件(.o)一共包含五個數據段:data(數據段)、bss段、text(程序段)、堆、棧;
本文通過Linux下size命令查看存放在data、bss、text的變量及常量;
先說結論:
- data:存放已初始化的靜態變量;
- bss:存放未初始化或初始化為零的靜態變量;
- text:存放程序執行代碼以及常量;
1.先放一段初始化程序,不包含任何變量作為對比:
1 python@ubuntu:~/Documents/c_fundamental/test_segment$ cat initial.c 2 #include<stdio.h> 3 4 int main(void) 5 { 6 return 0; 7 } 8 python@ubuntu:~/Documents/c_fundamental/test_segment$ size initial 9 text data bss dec hex filename 10 1099 544 8 1651 673 initial
2.查看未初始化靜態變量(全局&&局部)存放在哪個段:
1 python@ubuntu:~/Documents/c_fundamental/test_segment$ cat noninit_static.c 2 #include<stdio.h> 3 4 int g_iTest1; 5 static int g_iTest2; 6 int main(void) 7 { 8 static int g_iTest3; 9 return 0; 10 } 11 python@ubuntu:~/Documents/c_fundamental/test_segment$ size noninit_static 12 text data bss dec hex filename 13 1099 544 16 1659 67b noninit_static
對比發現全部存放在bss段
3.查看初始化為0的靜態變量(全局&&局部)存放在哪個段:
1 python@ubuntu:~/Documents/c_fundamental/test_segment$ cat zeroinit_static.c 2 #include<stdio.h> 3 4 int g_iTest1 = 0; 5 static int g_iTest2 = 0; 6 int main(void) 7 { 8 static int g_iTest3 = 0; 9 return 0; 10 } 11 python@ubuntu:~/Documents/c_fundamental/test_segment$ size zeroinit_static 12 text data bss dec hex filename 13 1099 544 16 1659 67b zeroinit_static
對比發現全部存放在bss段
4.查看初始化為非0的靜態變量(全局&&局部)存放在哪個段:
1 python@ubuntu:~/Documents/c_fundamental/test_segment$ cat init_static.c 2 #include<stdio.h> 3 4 int g_iTest1 = 1; 5 static int g_iTest2 = 2; 6 int main(void) 7 { 8 static int g_iTest3 = 3; 9 return 0; 10 } 11 python@ubuntu:~/Documents/c_fundamental/test_segment$ size init_static 12 text data bss dec hex filename 13 1099 556 4 1659 67b init_static
對比發現全部存放在data段
5.查看常量存放在哪個段:
1 python@ubuntu:~/Documents/c_fundamental/test_segment$ cat const_initial.c 2 #include<stdio.h> 3 4 const char szStr[20] = "hello, world!"; 5 int main(void) 6 { 7 return 0; 8 } 9 python@ubuntu:~/Documents/c_fundamental/test_segment$ size const_initial 10 text data bss dec hex filename 11 1131 544 8 1683 693 const_initial
對比發現常量字符串存放在text段
6.如何理解bss段不占用內存空間,以下面兩段代碼作為對比:
1 python@ubuntu:~/Documents/c_fundamental/test_segment$ cat bss_initial.c 2 #include<stdio.h> 3 4 int g_iBss[1024*1024]; 5 int main(void) 6 { 7 return 0; 8 } 9 python@ubuntu:~/Documents/c_fundamental/test_segment$ cat bssext_initial.c 10 #include<stdio.h> 11 12 int g_iBss[1024*1024] = {100}; 13 int main(void) 14 { 15 return 0; 16 }
1 python@ubuntu:~/Documents/c_fundamental/test_segment$ ls -lh bss* 2 -rwxrwxr-x 1 python python 4.1M Apr 17 05:57 bssext_initial 3 -rw-rw-r-- 1 python python 80 Apr 17 05:56 bssext_initial.c 4 -rwxrwxr-x 1 python python 8.4K Apr 17 05:57 bss_initial 5 -rw-rw-r-- 1 python python 72 Apr 17 05:56 bss_initial.c
1 python@ubuntu:~/Documents/c_fundamental/test_segment$ size bss*_initial 2 text data bss dec hex filename 3 1099 4194864 8 4195971 400683 bssext_initial 4 1099 544 4194336 4195979 40068b bss_initial
bssext_initial占用磁盤空間4.1M,bss_initial占用8.4k
變量在BBS段,是說明它的值內存是0,所以這些內存不保存在文件中。
但是變量就是一種符號,它的描述信息,該有的ELF描述信息(比如地址,類型……)還是要寫到ELF上的。