【ARM 嵌入式 编译系列 10.4.1 -- ELF 文件结构详细先容】

[复制链接]
发表于 2026-1-1 17:50:25 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
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 文件头部:
  1. readelf -h myfile.elf
复制代码
查察步调头表:
  1. readelf -l myfile.elf
复制代码
查察节头表:
  1. readelf -S myfile.elf
复制代码
arm-none-eabi-readelf -h demo.elf 下令用于读取和表现 ELF 文件的文件头信息。以下是对 demo.elf 文件头信息的详细表明:
  1. ELF Header:
  2.   Magic:   7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
  3.   Class:                             ELF32
  4.   Data:                              2's complement, little endian
  5.   Version:                           1 (current)
  6.   OS/ABI:                            UNIX - System V
  7.   ABI Version:                       0
  8.   Type:                              EXEC (Executable file)
  9.   Machine:                           ARM
  10.   Version:                           0x1
  11.   Entry point address:               0x289
  12.   Start of program headers:          52 (bytes into file)
  13.   Start of section headers:          748260 (bytes into file)
  14.   Flags:                             0x5000400, Version5 EABI, hard-float ABI
  15.   Size of this header:               52 (bytes)
  16.   Size of program headers:           32 (bytes)
  17.   Number of program headers:         4
  18.   Size of section headers:           40 (bytes)
  19.   Number of section headers:         21
  20.   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:
         
    • 值:ELF32   
    • 形貌:文件是 32 位格式。   
       
  • Data:
         
    • 值:2's complement, little endian   
    • 形貌:文件利用小端序(即最低有效字节存储在最小所在处)。   
       
  • Version:
         
    •   

回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表