ELF文件头结构

2023-10-27

转自 https://blog.csdn.net/tangyuesb/article/details/54630787

ELF文件头结构定义在“/usr/include/elf.h”头文件下,ELF文件有32位版本和64位版本,故其头文件结构也有32位结构和64位结构,分别定义为Elf32_Ehdr和Elf64_Ehdr。两种版本文件内容一样,只是有些成员的大小不一样。以下是32位版本的文件头结构Elf32_Ehdr。

typedef struct{
    unsigned char e_ident[EI_NIDENT];
    Elf32_Half e_type;
    Elf32_Half e_machine;
    Elf32_Word e_version;
    Elf32_Addr e_entry;
    Elf32_Off  e_phoff;
    Elf32_Off  e_shoff;
    Elf32_Word e_flags;
    Elf32_Half e_ehsize;
    Elf32_Half e_phentsize;
    Elf32_Half e_phnum;
    Elf32_Half e_shentsize;
    Elf32_Half e_shnum;
    Elf32_Half e_shstrndx;
}Elf32_Ehdr;

readelf -h test.o 可得如下输出:

ELF 头:
  Magic:   7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 
  类别:                              ELF32
  数据:                              2 补码,小端序 (little endian)
  版本:                              1 (current)
  OS/ABI:                            UNIX - System V
  ABI 版本:                          0
  类型:                              REL (可重定位文件)
  系统架构:                          Intel 80386
  版本:                              0x1
  入口点地址:               0x0
  程序头起点:          0 (bytes into file)
  Start of section headers:          916 (bytes into file)
  标志:             0x0
  本头的大小:       52 (字节)
  程序头大小:       0 (字节)
  Number of program headers:         0
  节头大小:         40 (字节)
  节头数量:         14
  字符串表索引节头: 11
  • 我们将Elf32_Ehdr结构与readelf命令输出的信息对比可得如下对应关系:
成员 readelf输出结果
e_ident Magic,类别,数据,版本,OS/ABI,ABI
e_type 类型
e_machine 系统架构
e_version 版本
e_entry 入口点地址
e_phoff start of program headers
e_shoff start of section headers
e_flags 标志
e_ehsize 文件头的大小
e_phentsize 程序头大小
e_phnum number of program headers
e_shentsize 节头大小
e_shnum number of program headers
e_shstrndx 字符串表段索引

下面我们依次分析各个部分。

魔数: 
Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 
7f 、45、4c、46分别对应ascii码的Del(删除)、字母E、字母L、字母F。这四个字节被称为ELF文件的魔数,操作系统在加载可执行文件时会确认魔数是否正确,如果不正确则拒绝加载。 
第五个字节标识ELF文件是32位(01)还是64位(02)的。 
第六个字节标识该ELF文件字节序是小端(01)还是大端(02)的。 
第七个字节指示ELF文件的版本号,一般是01。 
后九个字节ELF标准未做定义。一般为00.

文件类型: 
类型: REL (可重定位文件) 
e_type成员标识文件类型,ELF文件有三种类型,如下表所示。

常量标识 类型
ET_REL 1 可重定位文件,一般位.o文件
ET_EXEC 2 可执行文件
ET_DYN 3 共享目标文件,一般位.so文件

系统架构: 
系统架构: Intel 80386 
e_machine成员标识系统架构(机器类型),ELF定义了以下多种系统架构。可在“/usr/include/elf.h”头文件中查看,以下是其中的几种

常量标识 系统架构
EM_M32 1 AT&T WE 32100
EM_SPARC 2 SPARC
EM_386 3 Intel 80386
EM_68K 4 Motorola m68k family
EM_88K 5 Motorola m88k family
EM_860 6 Intel 80860
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ELF文件头结构 的相关文章

  • 在运行时动态修改符号表(C语言)

    是否可以在C运行时动态修改符号表 Linux上的elf格式 我的最终目标如下 在某些函数里面说foo 我想覆盖malloc函数到我的自定义处理程序my malloc 但在外面foo any malloc仍应像 glibc 中那样调用 mal
  • 当 VMA != LMA 时 ELF 加载

    我在这方面有一个问题 我使用 ARM Cortex A9 和 DS 5 来创建裸机固件 我修改了链接器文件 有意将 data 部分 LMA 与 text 和 rodata 部分相邻 因为其默认运行时 VMA 位于 1MB 之外 bin 映像
  • 按需加载/卸载 ELF 部分?

    对于一个相当晦涩的用例 我想要一个 大型 静态链接的 Linux 可执行文件 由一小段控制代码和大段静态 只读 数据组成 为了节省内存 是否可以让加载器仅加载控制代码的部分 然后根据需要手动加载 RO 数据的部分 并在处理完成后再次卸载它们
  • 如何使用汇编制作小型二进制文件?

    我正在为我的一些项目编写一些汇编代码 我看到了一些有趣的东西 链接时二进制文件的大小非常大 所以我测试了又测试 即使使用尽可能少的代码行 输出的 Elf 二进制文件也很大 例如 section text global start start
  • 如何通过pyelftools保存修改后的ELF

    最近我对ELF文件结构很感兴趣 在网上搜索 我发现了一个很棒的脚本 名为派尔夫工具 但实际上我不知道如何保存修改后的ELF ELFFile 类没有任何方法可以执行 首先 我喜欢下面的内容 header self elf header sel
  • 关于 DSO 引用隐藏符号的警告究竟意味着什么?

    我在将某些共享库与 g 链接时遇到问题 它给了我这样的警告 hidden symbol XXX in YYY is referenced by DSO usr lib 我已经阅读了一些有关特定问题的相关问题 但我想从整体上理解它 这个警告是
  • linux下如何将PE(Portable Executable)格式转换为ELF

    将 PE 二进制文件转换为 ELF 二进制文件的最佳工具是什么 以下是这个问题的简要动机 假设我有一个简单的 C 程序 我使用 Linux 的 gcc 编译它 这给出了 ELF 并使用 Windows 的 i586 mingw32msvc
  • 如何设计一个高并发系统?

    所谓高并发系统 是指能同时处理大量并发请求 并及时响应 从而保证系统的高性能和高可用 那么我们在设计一个高并发系统时 应该考虑哪些方面呢 1 搭建集群 如果你只部署一个应用 只部署一台服务器 那抗住的流量请求是非常有限的 并且 单体的应用
  • ELF 中的字符串表

    我得到一些符号 并得到一个 ELF 文件 的十六进制转储 我怎样才能知道这个符号出现在哪个部分 有什么区别 strtab and shstrtab 是否还有另一个符号字符串数组 当我获得符号名称表的索引时 它是 strtab or in s
  • 从 ELF 目标文件转储 C 结构大小

    如何使用调试符号从 ELF 目标文件中提取所有 C 结构的大小 可以使用 print sizeof some struct 从 GDB 获取各个结构大小 但我需要的是获取所有结构的列表 我查看了 nm 和 objdump 但没有看到执行我正
  • 如何将elf中的地址转换为物理地址

    我知道操作系统会将 elf 加载到物理内存中 执行时jmp elf address 系统将检查tlb并将elf地址转换为物理地址 我很困惑 elf address 没有段号和页号 操作系统如何将 elf address 转换为 MMU 需要
  • 在剥离的 ELF 可执行文件中设置断点

    我有一个 ELF 32 位动态链接 剥离文件 我希望对其进行调试 尝试在某个地址设置断点时 出现一条消息 提示符号表未加载 我的问题是 当你说 ELF 文件是stripped究竟发生了什么 如何剥离 ELF 文件 是否可以以某种方式重建符号
  • 编辑 ELF 文件中的变量值?

    我需要更改已编译的 ELF 文件中的几个变量 为了清楚地解释这一点 我将使用一个简单的 C 结构作为示例 单个源文件被编译并从 MyFile c 链接 0x1000 到 MyFile elf typedef struct uint32 t
  • 将文件打包为 ELF 可执行文件

    我目前正在寻找一种将数据添加到已编译的 ELF 可执行文件中的方法 即将文件嵌入到可执行文件中而不需要重新编译它 我可以通过使用轻松做到这一点cat myexe mydata gt myexe with mydata 但我无法访问可执行文件
  • ELF的基址

    我正在尝试查找 ELF 文件的基地址 我知道您可以使用 readelf 来查找程序入口点和不同部分的详细信息 基址 大小 标志等 例如 x86 架构的程序通过链接器基于 0x8048000 使用 readelf 我可以看到程序入口点 但输出
  • 静态库 (.a) 和共享库 (.so) 之间的文件格式差异?

    我知道关于共享库和静态库的用例有很多问题 这个问题与此无关 我问的是磁盘上存储的文件格式的差异 为什么问题是 两者之间有什么区别 或者它们完全相同 只是用途不同 我相信它们是不一样的 因为在共享库上运行 nm 需要 D 标志 显然它需要做一
  • 符号查找错误未定义符号,但所有符号似乎都存在

    可执行文件似乎无法解析链接库中的符号 LD DEBUG libs 的相关输出表明加载了正确的库 6557 usr lib libcharon so 0 error symbol lookup error undefined symbol a
  • 为什么 objdump 不显示 .bss、.shstratab、.symtab 和 .strtab 部分?

    我目前正在用 C 语言实现我自己的 objdump 实现 For my s选项 我必须显示 ELF 文件各部分的完整内容 我做得很好 但我显示的部分比 真正的 objdump 更多 事实上 它并没有输出 bss shstrtab symta
  • 更改 elf 调试信息中列出的源文件

    基本上我希望能够更改 elf 二进制文件中 debug dwarf 部分中源文件的路径 基本上我希望能够更改 elf 二进制文件中 debug dwarf 部分中源文件的路径 什么东西阻止你 该路径存储在 debug str二进制文件的一部
  • VMA和ELF段之间的关系

    我需要确定 ELF 可执行文件的可加载段的 VMA VMA 可以从以下位置打印 proc pid maps VMA 之间的关系如下所示maps可加载段对我来说也很清楚 每个段由一个或多个 VMA 组成 内核使用什么方法从 ELF 段形成 V

随机推荐

  • python docx 表格样式的设置修改表格列宽

    我的需求是设置表格的列宽和高度 之前的代码使用网上找的方法 table cell y x width Cm 4 无论怎么修改都是无效的 最后正确的代码是 col table columns 1 col width Inches 5
  • 修改mt4服务器地址,修改mt4服务器地址

    修改mt4服务器地址 内容精选 换一换 云平台支持修改主网卡的私有IP地址 具体操作请参见本节内容 如需修改扩展网卡的私有IP地址 请删除网卡 并挂载新网卡 云服务器已关机 如果网卡绑定了虚拟IP或者DNAT规则 需要先解绑 如果网卡上有I
  • [译] APT分析报告:03.OpBlueRaven揭露APT组织Fin7/Carbanak(上)Tirion恶意软件

    这是作者新开的一个专栏 主要翻译国外知名的安全厂商APT报告文章 了解它们的安全技术 学习它们溯源APT组织的方法 希望对您有所帮助 前文分享了钓鱼邮件网址混淆URL逃避检测 这篇文章将介绍APT组织Fin7 Carbanak的Tirion
  • 什么浏览器好用稳定速度快?

    什么浏览器好用稳定速度快 说到浏览器 不知道你们是否有这样的困惑和烦恼 浏览器换了一款又一款 内存大就不说了 体验总是不尽人意 经常弹出一些莫名其妙的资讯 还会出现卡住 奔溃 网页打开不完全 打开速度慢等情况 就拿我最近用的两款360来说吧
  • Nginx+lua实现秒杀系统架构

    能今天做好的事就不要等到明天 以梦为马 学习趁年华 文章目录 前言 一 秒杀业务特点 1 瞬时高并发 2 热点数据 3 读多写少 二 技术难点 1 数据一致性 2 库存超卖 三 秒杀注意事项 1 数据预热 2 请求承载 3 请求拦截 四 微
  • 重新理解Linux交叉编译及编译流程

    参考书籍 1 编译原理 2 嵌入式Linux应用开发 文章目录 一 交叉编译背景 二 gcc和arm linux gcc的常用选项 1 查询gcc帮助 2 常用gcc选项介绍 3 生成一个可执行文件的三种方法 二 交叉编译的四个流程及实例说
  • iOS编程基础-OC(六)-专家级技巧:使用ARC

    该系列文章系个人读书笔记及总结性内容 任何组织和个人不得转载进行商业活动 第6章 专家级技巧 使用ARC 本章是第一部分的最后一章 本章介绍ARC内存管理中的细微之处 如直接桥接对象使用ARC的方法 6 1 ARC和对象所有权 我们已经知道
  • 快排-java

    快排总结 分区方法 3个while 递归使用排序方法 使用了分治法 挖坑赋值法 package cn com import java util Arrays public class QuickSort public static void
  • 虚拟机上CentOS 7关闭防火墙操作

    虚拟机上CentOS 7关闭防火墙操作 1 首先查看防火墙的状态 使用的命令为 service iptables status 提示 Unit iptables service could not be found 解决方案 还原传统的管理
  • sprintf实例

    include
  • Unity热更新 ILRuntime 从零开始 HelloWorld(二)

    自从我凌晨两点放下喝醉的小姐姐回家写博客之后 小姐姐对我愈发的崇拜了 约我今晚一块学习ILRuntime 带好身份证 我这一想必须要未雨绸缪 安排 选了一个全市最好的网吧 斥巨资通宵5元 请小姐姐一块学习 一起记录下学习内容 这是这一系列文
  • 数字频率计设计

    FPGA教程目录 MATLAB教程目录 设计任务与要求 1 设计任务 设计并实现一个数字频率计 2 基本要求 测频率范围 10Hz 10K Hz 为保证测量精度分为三个频段 10Hz 100 Hz 100Hz 1K Hz 1 K Hz 10
  • lua语言json与table互转,简单方法

    使用方法 1 json转table luaJson json2lua tab 2 table转json luaJson table2json str 这个原理就是是逐个解析字符串 同样可以解析json xml 具体代码如下 这里解析json
  • wayland详解

    简单地说 Wayland是一套display server Wayland compositor 与client间的通信协议 而Weston是Wayland compositor的参考实现 其官网为http wayland freedesk
  • 如何制作网站?如何制作网站教程

    如果公司企业想要知道如何制作网站 那么需要了解一些相关的内容 本文将介绍如何制作网站教程 希望对大家有所帮助 首先我们做好一些准备 域名 建站工具 图文素材 营业执照等资质 步骤一 创建站点 进入建站工具 24 fkw com 后 在工具中
  • 前端Vue自定义精美商品分类组件category 可用于电商应用分类页面

    随着技术的发展 开发的复杂度也越来越高 传统开发方式将一个系统做成了整块应用 经常出现的情况就是一个小小的改动或者一个小功能的增加可能会引起整体逻辑的修改 造成牵一发而动全身 通过组件化开发 可以有效实现单独开发 单独维护 而且他们之间可以
  • 贝叶斯分类

    贝叶斯分类 贝叶斯分类是一类分类算法的总称 这类算法均以贝叶斯定理为基础 故统称为贝叶斯分类 本文作为分类算法的第一篇 将首先介绍分类问题 对分类问题进行一个正式的定义 然后 介绍贝叶斯分类算法的基础 贝叶斯定理 最后 通过实例讨论贝叶斯分
  • [Cmake]源码编译安装Cmake

    源码编译安装Cmake 获取cmake软件包 解压并进入软件包目录 执行配置 编译和安装命令 设置环境变量 执行如下命令验证是否安装成功 获取cmake软件包 wget https cmake org files v3 18 cmake 3
  • PTA 7-3 求整数序列中出现次数最多的数 (10 分)

    本题要求统计一个整型序列中出现次数最多的整数及其出现次数 输入格式 输入在一行中给出序列中整数个数N 0
  • ELF文件头结构

    转自 https blog csdn net tangyuesb article details 54630787 ELF文件头结构定义在 usr include elf h 头文件下 ELF文件有32位版本和64位版本 故其头文件结构也有