Android平台ELF文件格式简单介绍

ELF英文全程为:Executable Linkable Format,ELF属于Linux平台下可执行文件。ELF文件格式与Windows下的PE(Portable Executable)文件格式相似,都是属于COFF(Common File Format)文件格式变种。谷歌的Android操作系统内核采用Linux内核框架实现,所以Android平台原生文件格式与Linux可执行文件格式完全相似,同属于ELF类型文件。

Android平台下游戏逻辑通常使用C、C++语言实现,编译之后的可执行文件属于ELF文件格式,ELF文件格式整体布局如下图所示:
在这里插入图片描述
谷歌的Android NDK提供工具方便开发者查看ELF文件格式,对应工具名为:arm-linux-androideabi-readelf,工具所在NDK根目录的相对路径为:android-ndk-r9c\toolchains\arm-linux-androideabi-4.6\prebuilt\windows-x86_64\bin\,arm-linux-androideabi-readelf工具部分使用说明如下图所示:
在这里插入图片描述
本章使用“libTest.so”文件作为实例介绍ELF格式信息。下面将详细讲解ELF文件格式,以便让读者对Android平台原生程序的文件格式有较好理解。

1.1.1文件头信息

ELF文件头描述文件基本属性信息,包括ELF文件版本号、目标机器型号、程序入口、段表描述信息等信息。ELF文件头数据大小为0x34字节,实例文件的ELF文件头信息二进制数据如下所示:
在这里插入图片描述
上图中标为蓝色的数据为ELF文件头二进制内存数据,最右边可明显看出有“ELF”字符串,读者也许已猜到数据对应ELF文件标志,即判断是否为ELF文件表示。arm-linux-androideabi-readelf工具可方便查看ELF文件头信息。

利用arm-linux-androideabi-readelf工具查看ELF文件头信息命令如下:

arm-linux-androideabi-readelf.exe -h libTest.so

对应获取的文件头信息如下:
在这里插入图片描述
上图重要信息解释如下:

Magic:表示魔数标志信息,用来指明该文件是一个ELF目标文件,第一个字节固定为“7F”,后面三个字节为E、L、F字母的ASCII数值。同时魔数信息中还包含:版本信息、机器类型、文件类型等。

Type:表明文件类型,“DYN”表示实例所使用的文件属于动态链接库文件。

Machine:标识文件所采用指令类型,“ARM“表示当前ELF采用Arm指令集。

Start of program headers:表示程序头信息的起始偏移。        Start of section headers: 表示节表头信息的起始。                                 Size of program headers:表示程序头信息总共大小。      Number of program headers:表示程序头信息总共包含的项数。         Size of section headers: 表示节表头信息总共大小。      Number of section headers: 表示节表头信息总共包含的项数。    

下面附上ELF文件头每项数据定义:

typedef struct elf32_hdr{
unsigned char e_ident[EI_NIDENT];
Elf32_Half e_type;
Elf32_Half e_machine;
Elf32_Word e_version;
Elf32_Addr e_entry; // Entry point
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;

ELF文件头属于最开始的信息,从整理描述ELF文件下面各子项信息。

1.1.2 程序头信息

ELF文件程序头信息(program headers)是一个数据结构,每个数据结构描述一个段或者系统准备程序执行所需的其他信息,ELF文件的段(Segment)包含一个或者多个节区(Section)。ELF文件的段是为方便操作系统根据相同权限区段合并到一个段进行映射。ELF文件的程序头信息定义如下:

typedef struct elf32_phdr{
Elf32_Word p_type;
Elf32_Off p_offset;
Elf32_Addr p_vaddr; /* virtual address /
Elf32_Addr p_paddr; /
ignore /
Elf32_Word p_filesz; /
segment size in file /
Elf32_Word p_memsz; /
size in memory */
Elf32_Word p_flags;
Elf32_Word p_align;
} Elf32_Phdr;

利用arm-linux-androideabi-readelf工具查看ELF文件程序头信息,对应的命令如下:

arm-linux-androideabi-readelf.exe -l libTest.so

获取到的ELF文件程序头信息如下图所示:
在这里插入图片描述
上图总共有7个段信息,通过每个段的FLg表示可获取到段对应的内存属性。实际上真正需要装载到内存中的只有类型为“LOAD”的段,即:只有第2个和第3个需要装载到内存中,并且还可以看到每一个段的起始文件偏移地址、起始内存偏移地址、段大小、段权限、段对齐方式等信息。

命令输出的信息中包含“Section to Segment mapping”项数据,该项信息代表了section到segment的映射关键,例如:标号为2的Load段包含了: “.fini_array”、“.init_array”、“.dynamic”、 “.got”、“.data”、“.bss”六个节信息。

1.1.3 节表头信息

ELF文件中包含各种节段信息,它是一个Elf32_Shdr结构的数组,数据内容的定义如下所示:

typedef struct {

Elf32_Word sh_name; /* name of section, index */

Elf32_Word sh_type;

Elf32_Word sh_flags;

Elf32_Addr sh_addr; /* memory address, if any */

Elf32_Off sh_offset;

Elf32_Word sh_size; /* section size in file */

Elf32_Word sh_link;

Elf32_Word sh_info;

Elf32_Word sh_addralign;

Elf32_Word sh_entsize; /* fixed entry size, if have */

} Elf32_Shdr;

利用arm-linux-androideabi-readelf工具查看ELF文件节表头信息,对应的命令如下:

arm-linux-androideabi-readelf.exe -S libTest.so

获取到的ELF文件节表头信息如下图所示:
在这里插入图片描述
从节表头信息可获取到每个节段名字、长度、内存和文件的相对偏移、链接器、编译器、装载器等信息。实例样本总共有21个阶段,其中“.text”属于出现频率非常高的节段,绝大部分代码编译之后存放于“.text”段中。

ELF文件格式主要由以上介绍的三部分信息组成,分别为:ELF文件头、ELF程序头、ELF节表头。通过以上学习,读者可掌握Android平台原生ELF文件格式的结构信息。

查看全文

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.dgrt.cn/a/2123064.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章:

在这里插入图片描述

Android平台ELF文件格式简单介绍

ELF英文全程为:Executable Linkable Format,ELF属于Linux平台下可执行文件。ELF文件格式与Windows下的PE(Portable Executable)文件格式相似,都是属于COFF(Common File Format)文件格式变种。谷……

一文学会 Java 动态编译

Java动态编译技术在Java应用程序开发中扮演着越来越重要的角色。它可以让我们在程序运行时动态地生成和加载Java代码,从而实现更加灵活和高效的应用程序。本文将介绍Java动态编译技术的基本概念、实现方法和相关案例。
1. 基本概念
Java动态编译指的是在程序运行时……

Unity学习shader笔记[一百四十三]积雪二

这里是在 Unity学习shader笔记[一百二十四]积雪和PBR的shader 一做的更改
首先首要的还是找类似效果的插件
效果参考 https://live.csdn.net/v/281535
特点
坑洼处的地方先积雪雪地出现的形状特殊,是一个点一个点直接出现的,一出现就是不透明的颜色。……

【SQL开发实战技巧】系列(三十一):数仓报表场景☞分层查询如何只查询树形结构某一个分支?如何剪掉一个分支?

系列文章目录
【SQL开发实战技巧】系列(一):关于SQL不得不说的那些事 【SQL开发实战技巧】系列(二):简单单表查询 【SQL开发实战技巧】系列(三):SQL排序的那些事 【SQL开发实战技巧……

C语言取出一个长整型数中的偶数并构成一个新数案例讲解

思路分析 1 本题的难点在于:如何把一个长整型数中每一位上的数依次取出。
可以使用while循环对整数中的每一位进行取模操作,取出最后一位数,然后把这个数保存到一个数组中,并用除法去掉最后一位数,循环遍历直到一个整……

OpenFlamingo 多模态是GPT-4 开源替代品

非营利组织 LAION-AI OpenFlamingo,这是一个用于训练和评估大型多模态模型 LMM) 的框架,属于 DeepMind 的 Flamingo 模型(一种能够处理和推理图像、视频和文本的等多模态内容的框架)的开源复制品。 Announcing OpenFlamingo: A……

Windows命令:tasklist

TASKLIST [/S system [/U username [/P [password]]]][/M [module] | /SVC | /V] [/FI filter] [/FO format] [/NH]
描述: 该工具显示在本地或远程机器上当前运行的进程列表。
参数列表: /S system 指定连接到的远程系统。 /U [domain\]user 指定……

(实时更新)蓝桥杯知识点笔记 | (五)动态规划之基础DP

文章目录3. 动态规划(一)基础简单DP3.1 递推数字三角形HDU2018母牛的故事HDU2044一只小蜜蜂HDU2050折线分割平面3.2 LIS最长递增子序列AcWing4557.最长上升子序列mokit 2216. 例17.8 合唱队形Acwing1017.怪盗基德的滑翔翼Acwing1014.登山3.3 LCS最长公共……

YOLO算法改进指南【算法解读篇】:2.如何训练自己的数据集

我们接着上一篇文章配置完YOLOv5需要的环境后,今天我们试着用YOLOv5训练自己的数据。(在开始本教程前,记得先跑一遍入门篇,确保环境是正常的) 有图有真相,先看看我的运行结果 【YOLOv5 源码地址】
🚀 我的环境: 语言环境:Python3.8编译器:PyCharm深度学习环境: to……

STL容器之<map>

文章目录测试环境map介绍头文件模块类定义对象构造初始化元素访问元素插入和删除元素查找容器大小迭代器其他函数测试环境
系统:ubuntu 22.04.2 LTS 64位 gcc版本:11.3.0 编辑器:vsCode 1.76.2
map介绍
关联式容器。每个元素都包含用于排序……

反序列化渗透与攻防五)之shiro反序列化漏洞

Shiro反序列化漏洞
Shiro介绍
Apache Shiro是一款开源安全框架,提供身份验证、授权、密码学和会话管理。Shiro框架直观、易用,同时也能提供健壮的安全性
Apache Shiro 1.2.4及以前版本中,加密的用户信息序列化后存储在名为remember-me的Cookie中。攻击者可以使用Shiro的默……

vue2+vue3

vue2vue3尚硅谷vue2vue2 课程简介【02:24】vue2 Vue简介【17:59】vue2 Vue官网使用指南【14:07】vue2 搭建Vue开发环境【13:54】vue2 Hello小案例【22:25】了解: 不常用常用:id 更常用 简单class差值总结vue 实例vue 模板 : 先 取 &#xff0……

【hello Linux】环境变量

目录 1. 环境变量的概念 2. 常见的环境变量 3. 查看环境变量 4. 和环境变量相关的命令 5. 环境变量的组织方式 6. 通过代码获取环境变量 7. 通过系统调用获取环境变量 Linux🌷 在开始今天的内容之前,先来看一幅图片吧! 不知道你们是否和我一……

【Linux基础】常用命令整理

ls命令
-a选项,可以展示隐藏的文件和文件夹-l选项,以列表形式展示内容-h,需要和-l搭配使用,可以展示文件的大小单位ls -lah等同于la -a -l -h
cd命令(change directory)
语法:cd [Linux路径]……

客快物流大数据项目(一百一十二):初识Spring Cloud

文章目录
初识Spring Cloud
一、Spring Cloud简介
二、SpringCloud 基础架构图…

C和C++中的struct有什么区别

区别一: C语言中: Struct是用户自定义数据类型(UDT)。 C语言中: Struct是抽象数据类型(ADT),支持成员函数的定义。
区别二:
C中的struct是没有权限设置的&#xff0c……

docker的数据卷详解

数据卷 数据卷是宿主机中的一个目录或文件,当容器目录和数据卷目录绑定后,对方修改会立即同步
一个数据卷可以同时被多个容器同时挂载,一个容器也可以被挂载多个数据卷
数据卷作用:容器数据持久化 /外部机器和容器间接通信 /容器……

13、Qt生成dll-QLibrary方式使用

Qt创建dll,使用QLibrary类方式调用dll
一、创建项目
1、新建项目->其他项目->Empty qmake Project->Choose 2、输入项目名,选择项目位置,下一步 3、选择MinGW,下一步 4、完成 5、.pro中添加TEMPLATE subdirs&#xff……

基于mapreduce 的 minHash 矩阵压缩

Minhash作用: 对大矩阵进行降维处理,在进行计算俩个用户之间的相似度。
比如: 俩个用户手机下载的APP的相似度,在一个矩阵中会有很多很多的用户要比较没俩个用户之间的相似度是一个很大的计算任务 如果首先对这个矩阵降维处理&am……

关于hashmap使用迭代器的问题

keySet获得的只是key值的集合,valueSet获得的是value集合,entryset获得的是键值对的集合。 package com.test2.test;import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;public class mapiterator……

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注