文章目录
- ARM GCC ELF 文件结构详细介绍
- 1. ELF 文件概述
- 2. ELF 文件结构
- 2.1 ELF 头部(ELF Header)
- 2.2 ELF 数据(ELF Data)
- 2.2.1 程序头表(Program Headers)
- 2.2.2 节头表(Section Headers)
- 2.2.3 实际数据(Data)
- 3. 示例和工具
- 3.1 详细解释
- 4. Program Headers 概述
- 4.1 .text 段
- 4.2 .data 段
- 4.3 .bss 段
- 4.4 查看程序头表
- 5. Section Headers 概述
- 5.1 .text 节
- 5.2 .data 节
- 5.3 .bss 节
- 5.4 符号表节
- 6. 节头表字段
- 6.1 查看节头表
- 6.2 程序头表与节头表的区别与关系
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 文件头部:
readelf -h myfile.elf
查看程序头表:
readelf -l myfile.elf
查看节头表:
readelf -S myfile.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: ELF32Data: 2's complement, little endianVersion: 1 (current)OS/ABI: UNIX - System VABI Version: 0Type: EXEC (Executable file)Machine: ARMVersion: 0x1Entry point address: 0x289Start of program headers: 52 (bytes into file)Start of section headers: 748260 (bytes into file)Flags: 0x5000400, Version5 EABI, hard-float ABISize of this header: 52 (bytes)Size of program headers: 32 (bytes)Number of program headers: 4Size of section headers: 40 (bytes)Number of section headers: 21Section 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 字符
- 值: