可执行文件的段
C 程序在编译和链接后,生成可执行文件,它具有以下三个段(segments):
- 文本段(text):程序指令和字符串常量
- 数据段(data):已初始化的全局和
static
变量 - BSS 段(bss):未初始化的全局和
static
变量
注意,上述只描述的是可执行文件具有三个段,而不是由该三个段构成。
在 Linux 下,我们可以通过 size
命令输出可执行文件的段信息。
##内存布局
链接器:把可执行文件的段拷贝到内存中的程序
在可执行文件 装载
时,链接器会进行一系列操作,完成地址映射工作。
地址映射
文本段
存放程序指令和字符串常量
我们知道,可执行文件的文本段包含程序的指令,链接器把指令直接从可执行文件拷贝到内存中,形成文本段。
数据段
存放已初始化的全局变量和
static
变量
可执行文件的数据段包含经过初始化的全局和静态变量以及它们的值,形成数据段。
BSS 段
存放未初始化的全局变量和
static
变量
BSS 段的大小从可执行文件中得到,然后链接器得到这个大小的内存块,让其紧跟在数据段之后,该内存区进入程序的地址空间后全部清零,形成 BSS 段。
包含数据段和 BSS 段的整个区段,在载入内存后通常被称为数据区。这是因为在操作系统的内存管理术语中,段就是一片连续的虚拟地址,所以相邻的段被接合。一般情况下,在任何进程中,数据段是最大的段。
堆
由程序员分配和释放的内存空间
堆内存只在程序运行时出现,往高地址增长。
栈
存放自动变量;过程活动记录;暂时存储区
栈内存只在程序运行时出现,往低地址增长。
参考资料
- 《C 专家编程》- 第 6 章
- MEMORY MAP IN C
- C程序的内存布局
- 可执行程序中的段 (C专家编程)