zoukankan      html  css  js  c++  java
  • 通过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上的。

     

  • 相关阅读:
    [转载]为 Windows 下的 PHP 安装 PEAR 和 PHPUnit
    作品和案例
    js创建对象的最佳实践
    log4j的PatternLayout参数含义
    Java线程池——ThreadPoolExecutor的使用
    登录mysql 报 Access denied for user 'root'@'localhost' 错误
    CentOS 7下使用yum安装MySQL5.7
    linux下MySQL停止和重启
    Linux 命令 -- chown
    Linux 命令 -- chmod
  • 原文地址:https://www.cnblogs.com/taouu/p/14672216.html
Copyright © 2011-2022 走看看