自学内容网 自学内容网

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

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:                             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 详细解释
  1. Magic:
    • 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
    • 描述:魔数,用于标识文件为 ELF 文件。前四个字节 7f 45 4c 46 对应于 ASCII 字符

原文地址:https://blog.csdn.net/sinat_32960911/article/details/142549910

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!