在编译生成可执行程序时就会有地址空间,但是空间里没有堆栈这种在程序被加载到内存时才开辟的区域,但是已经存在代码区域和数据区域.
编译生成可执行程序时是有特定格式的,在linux下是ELF格式的.(库,.o,和可执行程序都是这个格式)

黄色
黄色部分为数据节(section),可执行程序的代码和数据会被压缩成一个一个的节。

链接后就构成了一个大的可执行程序.这个合并后的可执行程序也是ELF格式的.静态库在链接时也会合并.
红色
红色部分是EFL的表头,大体结构如下(了解下就行)表明可执行程序的属性

蓝色
蓝色部分是当程序加载到内存是它在内存中的整体布局,大体如下

(有load标记为的section就是要加载到内存中的)
(offset是偏移量(从黄色部分起算),filesize表示大小)
我们怎么知道每一个区域的开始和结束呢?
对任何一个文件,文件的内容就是一个巨大的"一维数组",表示文件任何区域,都可以用偏移量+大小的方式.
在可执行程序加载到内存时,操作系统通过pwd找到可执行程序,记录要加载的节偏移量 和长度.(也就是上面所说的load区域).
绿色
绿色部分是详细的节信息,见下(截取一部分)
