在用户态应用程序处理的任务中,elf 加载运行是一个比较重要的步骤,下面就分析一下在 rt-smart 操作系统中,想要将一个应用程序运行起来要经过哪些步骤。
ELF 格式介绍
ELF 代表 Executable and Linkable Format。它是一种对可执行文件、目标文件和库使用的文件格式。它在 Linux 下成为标准格式已经很长时间,ELF 一个特别的优点在于,同一文件格式可以用于内核支持的几乎所有体系结构上。
RT-SMART 同样也使用 ELF 作为可执行文件的格式,下面简单介绍一下 ELF 文件格式。
ELF 文件布局和结构
下图为 ELF 文件的基本布局:
上图展示了 elf 文件的重要组成部分:
elf 文件头,除了用于标识ELF文件的几个字节之外,ELF头还包含了有关文件类型和大小的有关信息,
及文件加载后程序执行的入口点信息。
程序头表(program header table)向系统提供了可执行文件的数据在进程虚拟地址空间中组织
方式的相关信息。它还表示了文件可能包含的段数目、段的位置和用途。
各个段保存了与文件相关的各种形式的数据。例如,符号表、实际的二进制码、固定值(如字
符串)或程序使用的数值常数。
节头表(section header table)包含了与各段相关的附加信息。
使用 readelf 工具可以读取该类型文件中的各种数据结构。
关键数据结构
想要理解应用程序的加载运行过程,就必须要先了解 ELF 文件中的关键数据结构,知道可以通过 ELF 文件获取那些程序加载所必须的关键信息,例如文件类型、目标体系架构、版本号、程序入口点以及程序运行所需要的数据段存储在什么位置等等信息。这些信息都存放在 ELF 的相关数据结构中,那么现在就先了解一下 ELF 文件的相关数据结构吧。
下面是在 ELF 加载过程上下文数据结构,这个结构中包括了 eheader、pheader 和 sheader 三个 elf 的关键数据结构。