【Linux】ELF可执行程序和动态库加载


🔥 个人主页:大耳朵土土垚 🔥 所属专栏:Linux系统编程
这里将会不定期更新有关Linux的内容,欢迎大家点赞,收藏,评论🥳🥳🎉🎉🎉

文章目录

  • [1. 可执行程序格式](#1. 可执行程序格式)
  • [2. 可执行程序加载](#2. 可执行程序加载)
  • [3. 动态库的加载](#3. 动态库的加载)

1. 可执行程序格式

  Linux操作系统上的可执行文件格式是ELF(Executable and Linkable Format)。ELF是一种灵活的、可扩展的文件格式,用于存储可执行程序、共享库和目标文件等二进制文件。

ELF文件采用分段(Segment)的结构,每个段都有不同的作用和属性。常见的段包括:

  1. 执行段(.text):包含程序的机器代码,用于执行程序的指令。

  2. 数据段(.data):包含程序的已初始化全局变量和静态变量等数据。

  3. 未初始化数据段(.bss):包含程序的未初始化全局变量和静态变量等数据。

  4. 符号表段(.symtab):包含程序的符号表,记录了程序的全局变量、函数、库的引用等信息。

此外,ELF文件格式还定义了一些特殊的节头表(Section Header Table)和程序头表(Program Header Table)来组织文件中的段和节信息。

如下图所示:

因为目标文件.o也是ELF格式,那么将目标文件链接为可执行程序实际上就是将相同属性的section合并:

  在Linux操作系统中,通过elf格式的可执行文件,操作系统可以读取文件中的节和段信息,并加载到内存中执行。这种文件格式的灵活性和可扩展性,使得Linux系统具有较强的兼容性和可移植性。

2. 可执行程序加载

  因为可执行程序在Linux内是以ELF格式呈现的,而ELF包含了程序的虚拟地址信息,所以程序在编译形成的时候其虚拟地址就已经确定好了;进程在运行程序时就会读取程序ELF信息来初始化mm_struct中的信息。

  此外可执行程序ELF中还保存了整个程序的入口地址Entry point address,这样当系统执行程序时,除了将ELF中的虚拟地址加载到mm_struct中,还会将整个程序的入口地址赋给CPUpc指针,(pc指针指向当前执行的命令)这样一个程序就可以执行下去了,所以执行程序使用的地址也是虚拟地址

  程序加载到内存中,是会有物理内存地址的,页表的作用就是将程序物理内存地址与虚拟地址之间进行映射,而CPU 中只保存虚拟地址是没办法在物理内存中找到程序的内容的,所以需要借助MMU硬件来将PC指针指向的虚拟地址转化为物理地址给CR3寄存器中,完成类似查表的操作,然后CPU 拿到了物理内存地址就可以去物理内存中找到对应的内容,并将该内容保存到CPUEIP中执行,执行完了,PC指针就根据该内容的大小保存下一个内容的虚拟指针(因为程序的虚拟指针都是按顺序递增的,增加的大小就是上一条命令的长度),然后再通过硬件转化为实际物理地址,循环往复,直到执行完所有命令,整个过程如下图所示:

3. 动态库的加载

  动态库的加载与可执行程序类似,但是它并不直接将虚拟地址保存到mm_struct中,而是在程序运行需要用到动态库时加载到内存中,并将自己的虚拟地址保存到一个结构体struct vm_area_struct中,因为动态库加载可能多个也可能不加载,所有Linux使用了一种灵活的数据结构来保存动态库的虚拟地址,该结构体实际上是一个链表,链接在mm_struct中的共享区中。

  程序在调用动态库中的方法时会先将动态库的起始虚拟地址保存起来,然后将调用的方法转化为该方法在动态库中的虚拟地址偏移量,这样就可以根据起始虚拟地址+偏移量的方法找到动态库中该方法的虚拟地址,然后CPU通过查表找到物理内存地址执行命令,过程如下图所示:

相关推荐
剑神一笑3 小时前
Linux pgrep 命令详解:按名称查找进程 PID 的高效方法
linux·运维·chrome
Lumbrologist3 小时前
【零基础部署】Docker 部署 CrewAI 多 Agent 编排框架保姆级教程
运维·docker·容器
yyuuuzz3 小时前
独立站的技术基础与常见运维问题
大数据·运维·服务器·网络·数据库·aws
剑神一笑3 小时前
Linux killall 命令详解:按进程名批量终止进程的原理与实践
linux·运维·chrome
雅菲奥朗4 小时前
企业级 AI 自动化|OpenClaw 龙虾实战与认证
运维·人工智能·自动化·openclaw
江华森5 小时前
Ansible 自动化运维:从入门到实战
运维·自动化·ansible
宋浮檀s7 小时前
应急响应——Web漏洞:命令执行+SSRF+弱口令
运维·数据库·sql·网络安全·oracle·应急响应
日取其半万世不竭8 小时前
iftop、nethogs 和 nload:Linux 服务器网络流量实时监控工具介绍
linux·运维·服务器
mounter6258 小时前
Linux 内核资源管理:控制组(cgroup)的演进与“策略组”新提案
linux·运维·服务器·cgroup·kernel
bksczm8 小时前
文件在磁盘中的存储方式
linux·运维·服务器