ELF存储空间到内存的映射关系

来源:互联网 发布:爱淘宝0.2元红包链接 编辑:程序博客网 时间:2024/06/10 21:08

映射关系

  • bss段:未初始化的全局变量和未初始化的局部静态变量,不占用程序文件的存储空间,程序启动后分配
#include <stdio.h>int bss_data[1024 * 1024];int main(){   return 0;}

gcc test.c -o bss
du -sh bss
12K bss

  • data段:初始化的全局变量和初始化的局部静态变量,占用程序文件的存储空间,也占用运行时的内存空间
#include <stdio.h>int bss_data[1024 * 1024] = {1};int main(){   return 0;}

gcc test.c -o data
du -sh data
4.1M data

  • rodata段(read only data)
    常量数据段,不是所有的常量都放在常量数据段,占用程序文件的存储空间,也占用内存空间
    比如字符串常量,全局const变量

  • text 段
    存放代码和部分常量,占用程序文件的存储空间,也占用内存空间

  • stack段
    临时变量、函数参数,不占用程序文件的存储空间,运行时分配内存

  • heap段
    malloc 和new,不占用程序文件的存储空间,运行时申请内存

总结:


  • 可执行二进制程序 = text + bss(0) + data + rodata
  • 正在运行的C程序 = text + bss + data + rodata + stack + heap

当程序被加载到内存单元时,则需要另外两个域:堆域和栈域,在将应用程序加载到内存空间执行时,操作系统负责代码段、数据段和BSS段的加载,并将在内存中为这些段分配空间。栈亦由操作系统分配和管理,而不需要程序员显示地管理;堆段由程序员自己管理,即显示地申请和释放空间。

注意:

bss段(未手动初始化的数据)并不给该段的数据分配空间. 程序运行后,系统分配内存空间并由系统初始化,默认内存空间的值都为0. section table中保存了BSS段(未初始化的全局变量和未初始化的局部静态变量)内存空间大小总和,所以程序运行后,系统知道该分配多少内存给BSS段。

原创粉丝点击