马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
ARM GCC ELF 文件结构详细先容
在利用 ARM GCC 编译过程中天生的 ELF 文件,可以分为两个重要部门:ELF 头部(ELF Header)和 ELF 数据(ELF Data)。进一步细分,ELF 数据由步调头表(Program Headers)、节头表(Section Headers)和实际数据(Data)构成。
1. ELF 文件概述
ELF 文件(Executable and Linkable Format)是用于存储可实行文件、共享库和目标文件的标准文件格式。它被广泛用于 Unix 和 Linux 体系中。明白其内部结构对于调试、优化和内存管理等嵌入式开辟任务非常告急。
2. ELF 文件结构
ELF 文件重要分为两个部门:
- ELF 头部(ELF Header):包罗文件范例、目标架构、入口点所在等根本信息。
- ELF 数据(ELF Data):包罗步调头表、节头表和实际数据。
2.1 ELF 头部(ELF Header)
ELF 头部是 ELF 文件的第一个部门,包罗了关于文件自己的总体信息。关键字段包罗:
- 把戏数(Magic Number):用于辨认文件格式。
- 文件范例(File Type):大概是可重定位文件、可实行文件或共享对象文件。
- 目标架构(Target Architecture):指定文件实用的硬件架构,如 ARM。
- 入口点所在(Entry Point Address):步调开始实行的位置。
- 步调头表偏移(Program Header Table Offset):步调头表在文件中的偏移位置。
- 节头表偏移(Section Header Table Offset):节头表在文件中的偏移位置。
2.2 ELF 数据(ELF Data)
ELF 数据包罗了步调的实际内容和结构信息,重要分为以下三个部门:
2.2.1 步调头表(Program Headers)
步调头表形貌了文件中的各个段(Segment),每个段都有详细的范例和属性。常见段包罗代码段、数据段等。关键字段包罗:
- 范例(Type):段的范例,比方可加载段(Loadable Segment)。
- 偏移(Offset):段在文件中的偏移位置。
- 假造所在(Virtual Address):段在内存中的假造所在。
- 物理所在(Physical Address):段在内存中的物理所在(假如须要)。
- 文件巨细(File Size):段在文件中的巨细。
- 内存巨细(Memory Size):段在内存中的巨细。
- 标志(Flags):段的权限标志,如可读、可写、可实行。
2.2.2 节头表(Section Headers)
节头表形貌了文件中的各个节(Section),每个节都有详细的名称和作用。常见节包罗代码节(.text)、数据节(.data)、未初始化数据节(.bss)等。关键字段包罗:
- 名称(Name):节的名称。
- 范例(Type):节的范例,比方代码、数据、符号表等。
- 所在(Address):节在内存中的所在。
- 偏移(Offset):节在文件中的偏移位置。
- 巨细(Size):节的巨细。
- 标志(Flags):节的权限标志。
2.2.3 实际数据(Data)
实际数据部门存储了步调的代码和数据,包罗:
- 代码段(.text):存放步调的呆板代码。
- 数据段(.data):存放已初始化的全局变量和静态变量。
- 未初始化数据段(.bss):存放未初始化的全局变量和静态变量,不占用文件空间。
- 只读数据段(.rodata):存放只读数据,比方字符串常量。
3. 示例和工具
利用 GCC 和 Binutils 提供的工具,可以查察和分析 ELF 文件的结构。
查察 ELF 文件头部:
查察步调头表:
查察节头表:
arm-none-eabi-readelf -h demo.elf 下令用于读取和表现 ELF 文件的文件头信息。以下是对 demo.elf 文件头信息的详细表明:
- ELF Header:
- Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
- Class: ELF32
- Data: 2's complement, little endian
- Version: 1 (current)
- OS/ABI: UNIX - System V
- ABI Version: 0
- Type: EXEC (Executable file)
- Machine: ARM
- Version: 0x1
- Entry point address: 0x289
- Start of program headers: 52 (bytes into file)
- Start of section headers: 748260 (bytes into file)
- Flags: 0x5000400, Version5 EABI, hard-float ABI
- Size of this header: 52 (bytes)
- Size of program headers: 32 (bytes)
- Number of program headers: 4
- Size of section headers: 40 (bytes)
- Number of section headers: 21
- Section header string table index: 20
复制代码 3.1 详细表明
- Magic:
- 值:7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
- 形貌:魔数,用于标识文件为 ELF 文件。前四个字节 7f 45 4c 46 对应于 ASCII 字符 .ELF,接下来的字节用于形貌文件格式的其他属性。
- Class:
- Data:
- 值:2's complement, little endian
- 形貌:文件利用小端序(即最低有效字节存储在最小所在处)。
- Version:
|