当前位置: 首页 > article >正文

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

文章目录

  • 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:                             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 字符

http://www.kler.cn/a/370399.html

相关文章:

  • 回归算法、聚类算法、决策树、随机森林、神经网络
  • 3 前端(中):JavaScript
  • 【汇编器和编译器的区别】
  • openharmony应用开发快速入门
  • 【QT用户登录与界面跳转】
  • 渗透笔记1
  • 大模型系列——AlphaZero/强化学习/MCTS
  • 解决milvus migration 迁移数据到出现数据丢失问题
  • 如何在Django中使用模板
  • 使用linuxdeployqt打包Qt程序问题及解决方法
  • 66Analytics 汉化版,网站统计分析源码,汉化前台后台
  • 达梦数据迁移工具DTS使用实践
  • GoogleChrome的安装和使用
  • 海洋生物图像分割系统:一键训练
  • Redis未授权访问及配合SSRF总结
  • 67.基于 DDR3 SDRAM 的 TFT_LCD 图像显示
  • springdata同时集成mongodb和elasticsearch异常
  • DispatchingController
  • 云计算平台上的DevOps实践
  • Docker Compose 发布一个 Node.js 项目
  • 前端自学资料(笔记八股)分享—CSS(4)
  • 【银河麒麟高级服务器操作系统·实例分享】裸金属服务器开机失败分析及处理建议
  • Go 语言的函数参数传递
  • javascript实现des算法(支持微信小程序)
  • 交叉编译 perl-5.40.0(riscv64)
  • ngrx store中createSelector的用法?