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