ELF文件格式解析一-程序员宅基地

技术标签: java  

一: 目标文件有三种类型:

  1. 可重定位文件(Relocatable File) 包含适合于与其他目标文件链接来创建可
    执行文件或者共享目标文件的代码和数据。
  2. 可执行文件(Executable File) 包含适合于执行的一个程序,此文件规定了
    exec() 如何创建一个程序的进程映像。
  3. 共享目标文件(Shared Object File) 包含可在两种上下文中链接的代码和数
    据。首先链接编辑器可以将它和其它可重定位文件和共享目标文件一起处理,
    生成另外一个目标文件。其次,动态链接器(Dynamic Linker)可能将它与某
    个可执行文件以及其它共享目标一起组合,创建进程映像。

目标文件全部是程序的二进制表示,目的是直接在某种处理器上直接执行。

二:ELF 中常用数据格式

在这里插入图片描述

三:目标文件格式

elf的文件类型有3种,可重定位文件和共享目标文件是为程序链接使用。 可执行文件参与程序执行。所以elf也提供了两种并行视图,链接视图和执行视图。
在这里插入图片描述

文件开始处是一个 ELF 头部(ELF Header),用来描述整个文件的组织。节区部
分包含链接视图的大量信息:指令、数据、符号表、重定位信息等等。
程序头部表(Program Header Table),如果存在的话,告诉系统如何创建进程映像。
用来构造进程映像的目标文件必须具有程序头部表,可重定位文件不需要这个表。
节区头部表(Section Heade Table)包含了描述文件节区的信息,每个节区在表中
都有一项,每一项给出诸如节区名称、节区大小这类信息。用于链接的目标文件必须包
含节区头部表,其他目标文件可以有,也可以没有这个表。

注意:尽管图中显示的各个组成部分是有顺序的,实际上除了 ELF 头部表以外,
其他节区和段都没有规定的顺序。

四: ELF Header 部分

文件的最开始几个字节给出如何解释文件的提示信息。这些信息独立于处理器,也
独立于文件中的其余内容。ELF Header 部分可以用下图中的数据结构表示:

#define EI_NIDENT 16
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;

五: 节区(Sections)

节区中包含目标文件中的所有信息,除了:ELF 头部、程序头部表格、节区头部
表格。节区满足以下条件:
(1). 目标文件中的每个节区都有对应的节区头部描述它,反过来,有节区头部不意
味着有节区。
(2). 每个节区占用文件中一个连续字节区域(这个区域可能长度为 0)。
(3). 文件中的节区不能重叠,不允许一个字节存在于两个节区中的情况发生。
(4). 目标文件中可能包含非活动空间(INACTIVE SPACE)。这些区域不属于任何
头部和节区,其内容未指定。

  • 5.1 节区头部表格
    ELF 头部中,e_shoff 成员给出从文件头到节区头部表格的偏移字节数;e_shnum
    给出表格中条目数目;e_shentsize 给出每个项目的字节数。从这些信息中可以确切地定
    位节区的具体位置、长度
typedef struct{
     
  Elf32_Word sh_name;
  Elf32_Word sh_type;
  Elf32_Word sh_flags;
  Elf32_Addr sh_addr;
  Elf32_Off sh_offset; 
  Elf32_Word sh_size;
  Elf32_Word sh_link;
  Elf32_Word sh_info;
  Elf32_Word sh_addralign;
  Elf32_Word sh_entsize; 
}Elf32_Shdr

elf格式的详细说明:elf格式
推荐一个elf分析软件。elf分析软件

参考资料
总结
通过以上的定义以及示例讲解,相信大家已经对ELF的文件格式有所了解了,如果想要继续深挖ELF文件的细节,大家可以参考以下这些资料。

1.《ELF格式解析》(Understanding ELF):作者是美国著名程序员John R. Levine,这本书是对ELF文件格式最全面和最深入的讲解之一。2.《程序员的自我修养》:作者是俄罗斯程序员大牛俄罗斯程序员大牛陈皓,本书从程序员的基础能力入手,阐述了编程语言、编译原理、操作系统、网络协议等领域的知识。3.《Linux内核源代码情景分析》:本书的作者是一名国内的Linux内核专家,通过分析Linux内核的源代码,介绍了Linux操作系统的内部机制和实现方法,其中也包括了ELF文件格式的相关内容。

2.《程序员的自我修养》:作者是俄罗斯程序员大牛俄罗斯程序员大牛陈皓,本书从程序员的基础能力入手,阐述了编程语言、编译原理、操作系统、网络协议等领域的知识。

3.elf文件格式分析.pdf 滕启明

4.《Linux内核源代码情景分析》:本书的作者是一名国内的Linux内核专家,通过分析Linux内核的源代码,介绍了Linux操作系统的内部机制和实现方法,其中也包括了ELF文件格式的相关内容。

1.https://en.wikipedia.org/wiki/Executable_and_Linkable_Format
2.https://linux-audit.com/elf-binaries-on-linux-understanding-and-analysis/
3.https://refspecs.linuxfoundation.org/elf/elf.pdf
4.https://paper.seebug.org/papers/Archive/refs/elf/Understanding_ELF.pdf
5.https://learningos.cn/ucore_os_webdocs/
https://learningos.cn/ucore_os_webdocs/lab1/lab1_3_2_4_elf.html

6.https://blog.csdn.net/xuehuafeiwu123/article/details/72963229

7.https://blog.51cto.com/lyshark/5976731?articleABtest=1

8.https://hex-rays.com//ida-pro/

10.https://blog.csdn.net/vdigital/article/details/131333998

11.https://blog.csdn.net/nodeathphoenix/article/details/8880259?utm_medium=distribute.pc_relevant.none-task-blog-2defaultbaidujs_baidulandingword~default-8-8880259-blog-104077452.235v40pc_relevant_rights_sort&spm=1001.2101.3001.4242.5&utm_relevant_index=11 elf格式介绍

  1. System V Application Binary Interface - DRAFT - 24 April 2001

  2. http://www.staroceans.org/e-book/elf-64-hp.pdf

  3. 参考代码 参考代码

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_37564426/article/details/135438711

智能推荐

Java 异常:捕获异常_java子异常与父异常如何补获-程序员宅基地

文章浏览阅读611次。语法结构 1.捕获异常语法结构: 红框:使用try{}块来抛出异常蓝框:使用try{}块来抛出异常橙框:由于对循环体中的异常进行了捕获处理,所以该行代码可以执行 2.try…catch…finally异常处理结构中,try语句块是必须的, catch和finally语句块至少出现一个。 3.注意:如果try语句块包含的是检查时异常,则在没有..._java子异常与父异常如何补获

【最新Unity3D—Particle System粒子系统】最新Unity2017.2018.2019.2020均适用且超详细_unity particle system 实例化-程序员宅基地

文章浏览阅读299次。方法1.GameObject中选择Particle System,即可在场景中创建粒子系统对象方法2.先create empty ,再到Component中选择Effects后,选择Particle System,即为该空物体添加了粒子系统组件。_unity particle system 实例化

通过EasyX实现Bresenham画线_easyx线条粗细-程序员宅基地

文章浏览阅读1k次,点赞2次,收藏3次。基本上Bresenham画线算法的思路如下:// 假设该线段位于第一象限内且斜率大于0小于1,设起点为(x1,y1),终点为(x2,y2).// 根据对称性,可推导至全象限内的线段.1.画起点(x1,y1).2.准备画下个点。x坐标增1,判断如果达到终点,则完成。否则,由图中可知,下个要画的点要么为当前点的右邻接点,要么是当前点的右上邻接点.2.1.如果线段ax+by+c=0与x=x1..._easyx线条粗细

i5-1035G1和R7 4800U 哪个好_r74800u和i51035g1哪个好-程序员宅基地

文章浏览阅读7.7k次。酷睿i5-1035G1是一款高效的四核SoC,适用于基于Ice -Lake-U 系列的笔记本电脑和超极本 。它集成了四个Sunnycove处理器内核(由于HyperThreading而支持8个线程),主频为1(基本) – 3.7(单核Turbo)GHz。选锐龙i5-1035G1 还是R7 4800U 哪个好 https://list.jd.com/list.html使用Turbo Boost,2个内核可以达到3.6 GHz,所有4个3.3 GHz。据英特尔称,Sunnycove内核的IPC数量增加了1_r74800u和i51035g1哪个好

Forth_forth语言 浮点数-程序员宅基地

文章浏览阅读2.9k次。C 语言使你迷茫?Forth 可能是一个答案程序语言2010-05-25 22:27:28阅读153评论0 字号:大中小 订阅转自:http://www.embeddedsoft.cn/news-detail.aspx?Id=100原标题 Lost at C? Forth May Be the Answer 原作者 Tom Napier 和 Eric Krieg 原文引自 www.Forth.org 曾经有个时期,人们不害怕从_forth语言 浮点数

Centos7 安装MySQL详细步骤_centos7安装mysql-程序员宅基地

文章浏览阅读2.3w次,点赞20次,收藏124次。Centos7 安装MySQL详细步骤 _centos7安装mysql

随便推点

Wireshark简单使用-程序员宅基地

文章浏览阅读794次,点赞14次,收藏18次。wireshark下载、安装、使用教程

MXNet 粗糙的使用指南_iou loss mxnet-程序员宅基地

文章浏览阅读288次。MXNet 粗糙的使用指南写于2020年3月24日,最新的CUDA版本为10.2MXNet简介MXNet是一个(跟TF与Torch相比特别小众的)多平台神经网络框架。优点:灵活,多平台,可移植性强。工业界常用框架。缺点:复杂,难以入门,基本没有教材。只能依靠代码来学习代码。框架介绍MXNet现在存在两种界面:symbol与gluon。Symbol的设计思路与T..._iou loss mxnet

iOS对ipa包进行代码混淆《二》 ---代码混淆_ipa包混淆-程序员宅基地

文章浏览阅读1.3k次。接上一篇文章ipa包砸壳,接下来讲一下代码混淆。混淆代码,我们需要生成两个文件confuse.sh和func.list。confuse.sh是一个脚本文件,里边定义了混淆的一些算法,以及需要混淆方法的路径。func.list是我们列举的一些需要混淆的方法。当然系统的方法不能混淆,不然一些库文件方法没办法正确加载。1、首先,终端cd到文件目录,并且利用指令touch生成这两个文件touch confuse.shtouch func.list不出意外,文件目录里已经有这两个文件了。_ipa包混淆

matlab(4):特殊符号的输入_matlab微米怎么输入-程序员宅基地

文章浏览阅读3.3k次,点赞5次,收藏19次。xlabel('\delta');ylabel('AUC');具体符号的对照表参照下图:_matlab微米怎么输入

C语言程序设计-文件(打开与关闭、顺序、二进制读写)-程序员宅基地

文章浏览阅读119次。顺序读写指的是按照文件中数据的顺序进行读取或写入。对于文本文件,可以使用fgets、fputs、fscanf、fprintf等函数进行顺序读写。在C语言中,对文件的操作通常涉及文件的打开、读写以及关闭。文件的打开使用fopen函数,而关闭则使用fclose函数。在C语言中,可以使用fread和fwrite函数进行二进制读写。‍ Biaoge 于2024-03-09 23:51发布 阅读量:7 ️文章类型:【 C语言程序设计 】在C语言中,用于打开文件的函数是____,用于关闭文件的函数是____。

Touchdesigner自学笔记之三_touchdesigner怎么让一个模型跟着鼠标移动-程序员宅基地

文章浏览阅读3.4k次,点赞2次,收藏13次。跟随鼠标移动的粒子以grid(SOP)为partical(SOP)的资源模板,调整后连接【Geo组合+point spirit(MAT)】,在连接【feedback组合】适当调整。影响粒子动态的节点【metaball(SOP)+force(SOP)】添加mouse in(CHOP)鼠标位置到metaball的坐标,实现鼠标影响。..._touchdesigner怎么让一个模型跟着鼠标移动