【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:                             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 详细解释
  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.mzph.cn/web/57166.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

windows 下安装 make

Error running ‘docs’: Cannot run program “\usr\bin\make” (in directory “F:\xx\goland-api\xxxx-go”): CreateProcess error2, 系统找不到指定的文件。 windows上安装:chocolatey github地址: https://github.com/chocolatey/choco/releases然…

PAT甲级-1052 Linked List Sorting

题目 题目大意 给定一个链表,要求按链表中的数值从小到大排序生成新的链表。输出有效节点的个数和链表的起始地址,以及链表本身。 思路 链表用结构体数组来表示,然后用sort自定义排序。需要注意的是,链表中存在无效节点&#x…

【CSS in Depth 2 精译_055】8.3 伪类 :is() 和 :where() 的正确打开方式

当前内容所在位置(可进入专栏查看其他译好的章节内容) 【第三部分 现代 CSS 代码组织】 ✔️【第八章 层叠图层及其嵌套】 ✔️ 8.1 用 layer 图层来操控层叠规则(上篇) 8.1.1 图层的定义(上篇)8.1.2 图层的…

React基础语法

1.React介绍 React由Meta公司开发,是一个用于构建Web和原生交互界面的库 1.1 React优势 相较于传统基于DOM开发的优势 1.组件化的开发方式 2.不错的性能 相较于其他前端框架的优势 1.丰富的生态 2.跨平台支持 1.2React的时长情况 全球最流行,大厂…

C语言数据结构:排序(2)

文章目录 4.选择排序4.1 基本思想4.2 排序实现 5.快排5.1 基本思想5.2 递归实现快排5.3 快排优化5.4 双指针法完成快排5.5 快排的非递归 6.归并排序6.1 基本思想6.2 排序的实现6.3 归并排序的非递归 7. 计数排序7.1 基本思想7.2 排序实现7.3 排序的优缺点 8.排序总结 4.选择排序…

C++初阶教程——C++入门

一、本章主要内容 C在C的基础之上,加入了面向对象编程的思想,并增加了许多有用的库以及编程范式。可以说,C是C的子集。在这章的内容中,笔者将会为诸位读者讲C如何补充C语言的一些不足。比如:作用域、IO、函数、指针等。…

【Golang】Go语言中如何进行包管理

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

JetBrains IDE中GPU进程(JCEF)重启问题(Too many restarts of GPU-process)解决方案

目录 前言1. GPU进程重启问题概述1.1 什么是GPU进程重启问题?1.2 该问题带来的影响 2. GPU进程重启问题的原因分析2.1 显卡驱动的兼容性问题2.2 系统资源的限制2.3 JCEF组件的设置不合理 3. 解决方案3.1 方法一:通过自定义属性禁用GPU加速3.2 方法二&…

20241028在荣品PRO-RK3566开发板的预置Android13下用iperf3测试AP6256的WIFI网速

20241028在荣品PRO-RK3566开发板的预置Android13下用iperf3测试AP6256的WIFI网速 2024/10/28 18:17 荣品PRO-RK3566开发板作为服务器端: 笔记本电脑作为客户端。 接公司的网络。 在笔记本电脑的ubuntu20.04下,通过nethogs实测iperf3的发送速度大概是10MB…

410wifi的正确利用之路——debian 11

装上openwrtadguard太卡了,10min自启一次,当无线网卡都费劲。 网桥、USB千万网段要和主网独立 wifi连接激活后再改静态ip 高通410 修复debian 11的环境 1 换debian11源 (1)切换为国内的软件源(可以加快软件更新时的…

如何快速删除node_modules依赖包的方法。

可以通过下载rimraf命令行工具进行删除。 1.通过npm下载rimraf命令行工具 npm install -g rimraf2.通过命令行进行删除node_modules依赖包 rimraf node_modules3.删除完成后,你可以进行选择重新下载node_modules依赖包 npm install此场景适用于你想重置node_modu…

压力测试Monkey命令参数和报告分析!

adb的操作命令格式一般为&#xff1a;adb shell monkey 命令参数 PART 01 常用参数 ⏩ -p <测试的包名列表> 用于约束限制&#xff0c;用此参数指定一个或多个包。指定包之后&#xff0c;Monkey将只允许系统启动指定的APP。如果不指定包&#xff0c;Monkey将允许系统…

Vue中使用 vuedraggable进行拖拽

本文主要记录下 vuedraggable拖拽 在 vue2 和 vue3 中使用上的区别。 一、安装 vue2 安装命令 npm i vuedraggable -S vue3 安装会报错&#xff1a;Cannot read property header of undefined。安装最新版本的vuedraggable即可&#xff0c;命令行如下 vue3 安装命令 npm i…

shodan-5

声明&#xff1a;学习视频来自b站up主 泷羽sec&#xff0c;如涉及侵权马上删除文章 感谢泷羽sec 团队的教学 视频地址&#xff1a;shodan(5)_哔哩哔哩_bilibili 一、shodan语法 1、net shodan search --limit 10 --fields ip_str, port net:208.88.84.0/24 搜索一个网段内的I…

SSA-CNN-LSTM-MATT多头注意力机制多特征分类预测

SSA-CNN-LSTM-MATT多头注意力机制多特征分类预测 目录 SSA-CNN-LSTM-MATT多头注意力机制多特征分类预测分类效果基本介绍程序设计参考资料 分类效果 基本介绍 1.Matlab实现SSA-CNN-LSTM-MATT麻雀算法优化卷积神经网络-长短期记忆神经网络融合多头注意力机制多特征分类预测&…

Ubuntu:通过ssh链接另外一台Ubuntu

本文将介绍通过ssh链接另外一台Ubuntu的方法。 一、安装openssh-server sudo apt update sudo apt install openssh-server二、查看SSH是否运行 sudo systemctl status ssh三、链接 ssh usernameremote_ip_address四、复制A电脑的文件到本地 scp usernameremote_ip_addres…

【数据结构-邻项消除】2696. 删除子串后的字符串最小长度

给你一个仅由 大写 英文字符组成的字符串 s 。 你可以对此字符串执行一些操作&#xff0c;在每一步操作中&#xff0c;你可以从 s 中删除 任一个 “AB” 或 “CD” 子字符串。 通过执行操作&#xff0c;删除所有 “AB” 和 “CD” 子串&#xff0c;返回可获得的最终字符串的 …

图像处理 -- RAW数据处理之Bayer 插值(去马赛克)的算法与用法

Bayer 插值算法及 128x64 RAW10 转换示例 常见的 Bayer 插值算法 Bayer 插值&#xff08;也称为去马赛克&#xff09;是一种将 Bayer 格式的原始图像数据转换为全彩图像的过程。Bayer 插值的目标是从原始 Bayer 图像数据中的单一颜色通道样本中&#xff0c;估计出每个像素点的…

【前端】在 Next.js 中添加对 API 的监控和日志记录

API 的监控和日志记录对于维护系统的稳定性和性能至关重要。良好的监控和日志记录可以帮助您及时发现和解决问题。以下是一些常用的监控和日志记录实践和技术&#xff1a; 1. 日志记录 使用框架内置的日志功能 Next.js 本身提供了基本的日志记录功能&#xff0c;但您可能需要…

GPU 服务器厂家:中国加速计算服务器市场的前瞻洞察

科技的飞速发展&#xff0c;让 GPU 服务器在加速计算服务器领域的地位愈发凸显。中国加速计算服务器市场正展现出蓬勃的生机&#xff0c;而 GPU 服务器厂家则是这场科技盛宴中的关键角色。 从市场预测的趋势来看&#xff0c;2023 年起&#xff0c;中国加速计算服务器市场便已展…