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

 

原文地址:https://www.cnblogs.com/taouu/p/14672216.html