可执行文件的数据存储+c语言内存分区
参考:https://blog.youkuaiyun.com/love_gaohz/article/details/41310597
https://www.cnblogs.com/southcyy/p/10167005.html
一、ELF文件数据格式分析:
在学习之前我们先看看ELF文件的存储格式。
ELF分为三种类型:
a. x.o 可重定位文件(relocalble file)
b.可执行文件
c.共享库(shared library)
三种格式基本上从结构上是一样的,只是具体到每一个结构不同。下面我们就从整体上看看这3种格式从文件内容上存储的方式,spec上有张图是比较经典的:如上图:
其实从文件存储的格式来说,上面的两种view实际上是一样的,Segment实际上就是由section组成的,将相应的一些section映射到一起就叫segment了,就是说segment是由0个或多个section组成的,实际上本质都是section。
在这里我们首先来仔细了解一下section和segment的概念:section就是相同或者相似信息的集合,比如我们比较熟悉的x.text、x.data、x.bss 的section,x.text是可执行指令的集合,x.data是初始化后数据的集合,x.bss是未初始化数据的集合。实际上我们也可以将一个程序的所有内容都放在一起,就像dos一样,但是将可执行程序分成多个section是很有好处的,比如说我们可以将.text section放在memory的只读空间内,将可变的.data section放在memory的可写空间内。
从可执行文件的角度来讲,如果一个数据未被初始化那就不需要为其分配空间,所以.data和.bss一个重要的区别就是.bss并不占用可执行文件的大小,它只是记载需要多少空间来存储这些未初始化数据,而不分配实际的空间。
二、存储空间分段
站在高级语言的角度,一个程序分为如下段:
1. text
2. data (initialized)
3. bss
4. stack
5. heap