可执行程序的格式

在编译生成可执行程序时就会有地址空间,但是空间里没有堆栈这种在程序被加载到内存时才开辟的区域,但是已经存在代码区域和数据区域.

编译生成可执行程序时是有特定格式的,在linux下是ELF格式的.(库,.o,和可执行程序都是这个格式)

黄色

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

链接后就构成了一个大的可执行程序.这个合并后的可执行程序也是ELF格式的.静态库在链接时也会合并.

红色

红色部分是EFL的表头,大体结构如下(了解下就行)表明可执行程序的属性

蓝色

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

(有load标记为的section就是要加载到内存中的)

(offset是偏移量(从黄色部分起算),filesize表示大小)

我们怎么知道每一个区域的开始和结束呢?

对任何一个文件,文件的内容就是一个巨大的"一维数组",表示文件任何区域,都可以用偏移量+大小的方式.

在可执行程序加载到内存时,操作系统通过pwd找到可执行程序,记录要加载的节偏移量 和长度.(也就是上面所说的load区域).

绿色

绿色部分是详细的节信息,见下(截取一部分)

相关推荐
readhere7 小时前
从ZYNQ7000开发板,学会启动嵌入式Linux系统——入门学习:EBAZ4205篇目录
linux·启动·嵌入式linux·zynq7000·ebaz4205
打工仔折腾 AI8 小时前
在 Ubuntu ARM64 部署 Q1 V3.0 MuJoCo 模型:加载、单步推理与执行器响应解析
linux·运维·人工智能·python·深度学习·ubuntu·性能优化
‎ദ്ദിᵔ.˛.ᵔ₎9 小时前
关于Linux 线程局部存储的认识
linux·运维
小小de风呀11 小时前
de风——【从零开始学习Linux】(九):进程基础 —— 从冯诺依曼体系到 fork 创建进程
linux·学习
晚风吹北巷12 小时前
Linux复习篇(自用)
linux·运维·服务器·1024程序员节
by2099913 小时前
Linux 压缩传输、进程查看与权限管理
linux·经验分享·1024程序员节
无足鸟ICT14 小时前
【RHCA+】reboot命令(重启)
linux·运维·服务器·1024程序员节
DYWorker00114 小时前
第1课:基于正点原子RK3568开发板读懂Linux内核
linux·运维·网络
Android系统攻城狮15 小时前
Linux FFmpeg深度解析之avformat_open_input调用流程与实战(一)
linux·运维·ffmpeg·车载音视频·ffmpeg音视频·音视频进阶手册