通過size命令查看目標文件的三個段(bss、data、text)


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上的。

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM