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

本文介绍了ELF文件的各个段,如text、data、bss、rodata和stack,以及它们在内存中的映射关系。text段存放代码和部分常量,data和rodata分别用于初始化和未初始化的数据,bss段在运行时分配,stack用于临时变量和函数参数,heap用于malloc/new。可执行程序空间包括text、bss、data和rodata,而运行时的C程序还包括stack和heap。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

映射关系

  • 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段。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值