C语言可执行文件的内存结构

本网站用的阿里云ECS,推荐大家用。自己搞个学习研究也不错

<

div id=”content”>以前看过C可执行文件的内存结构,但都只是当时很清楚,时候就忘的差不多了,没有细细去品味,一段时间就忘得差不多了,今天看了一些书籍和博文,决定将C可执行文件的内存结构的内容通过博客记录下来。

下面是一张C可执行文件的内存结构:

C语言可执行文件的内存结构

可见进程的逻辑地址空间可分为代码段,数据段,bss段,以及堆和栈段。这些段存放的数据分别是:

代码段:存放二进制程序,和常量。

可通过size命令查看可执行文件的各个段的大小:

#include

int main(int argc,char *argv[])

{

        printf(“hello world”);

}

[root@bogon cstudy]# gcc 8.c

[root@bogon cstudy]# size a.out

  text      data        bss        dec        hex    filename

  1157        492        16      1665        681    a.out

#include

int main(int argc,char *argv[])

{

        char *p=”aaaa”;//常量,应该放在text段

        printf(“hello world”);

}

[root@bogon cstudy]# gcc 8.c

[root@bogon cstudy]# size a.out

  text      data        bss        dec        hex    filename

  1162        492        16      1670        686    a.out

 

可以发现text字段增加了5个字节,aaaa\0正好就是五个字节。

数据段:存放全局的或者静态的初始化变量

#include

int main(int argc,char *argv[])

{

        printf(“hello world”);

}

[root@bogon cstudy]# gcc 8.c

[root@bogon cstudy]# size a.out

  text      data        bss        dec        hex    filename

  1157        492        16      1665        681    a.out

#include

int a = 6;

int main(int argc,char *argv[])

{

        static int b = 6;

        printf(“hello world”);

}

[root@bogon cstudy]# size a.out

  text      data        bss        dec        hex    filename

  1157        500        16      1673        689    a.out

 

可见data数据段增加了八个字节正好是两个int型变量。

但是如果变量未初始化,或者变量初始化为0是不放在数据段的,而是放在bss段。

#include

int a = 0;

int main(int argc,char *argv[])

{

        static int b;

        printf(“hello world”);

}

[root@bogon cstudy]# gcc 8.c

[root@bogon cstudy]# size a.out

  text      data        bss        dec        hex    filename

  1157        492        24      1673        689    a.out

BSS段:存放未初始化的全局或者静态变量,或者初始化为0的全局或者静态变量。

堆段:一般是用户手动分配的,也就是通过malloc函数来手动分配内存的。

栈段:由编译器自动分配释放 ,存放函数的参数值,局部变量的值等

C++ Primer Plus 第6版 中文版 清晰有书签PDF+源代码 http://www.linuxidc.com/Linux/2014-05/101227.htm

读C++ Primer 之构造函数陷阱 http://www.linuxidc.com/Linux/2011-08/40176.htm

读C++ Primer 之智能指针 http://www.linuxidc.com/Linux/2011-08/40177.htm

读C++ Primer 之句柄类 http://www.linuxidc.com/Linux/2011-08/40175.htm

将C语言梳理一下,分布在以下10个章节中:

<

ol>

  • Linux-C成长之路(一):Linux下C编程概要 http://www.linuxidc.com/Linux/2014-05/101242.htm
  • Linux-C成长之路(二):基本数据类型 http://www.linuxidc.com/Linux/2014-05/101242p2.htm
  • Linux-C成长之路(三):基本IO函数操作 http://www.linuxidc.com/Linux/2014-05/101242p3.htm
  • Linux-C成长之路(四):运算符 http://www.linuxidc.com/Linux/2014-05/101242p4.htm
  • Linux-C成长之路(五):控制流 http://www.linuxidc.com/Linux/2014-05/101242p5.htm
  • Linux-C成长之路(六):函数要义 http://www.linuxidc.com/Linux/2014-05/101242p6.htm
  • Linux-C成长之路(七):数组与指针 http://www.linuxidc.com/Linux/2014-05/101242p7.htm
  • Linux-C成长之路(八):存储类,动态内存 http://www.linuxidc.com/Linux/2014-05/101242p8.htm
  • Linux-C成长之路(九):复合数据类型 http://www.linuxidc.com/Linux/2014-05/101242p9.htm
  • Linux-C成长之路(十):其他高级议颼/div>

    未经允许不得转载:演道网 » C语言可执行文件的内存结构

  • 赞 (0)
    分享到:更多 ()

    评论 0

    评论前必须登录!

    登陆 注册