ELF文件结构(Android 动态链接库)

本文详细介绍了ELF文件结构,包括ELF Header、Program Header Table、Sections和Segments。分析了它们在链接和执行视图中的角色,特别强调了Segment在内存中的包含关系以及Section的角色定位。此外,还探讨了在Android环境下ELF的加载逻辑和应用,如动态链接库加载、Got Hook等。
摘要由CSDN通过智能技术生成

对学习到ELF文件结构的相关知识做一个简单的梳理,这些知识主要来自自己文件和代码的翻阅和其他博客,做提醒作用,想真的理解还请翻阅相关源码和结合手上的so慢慢翻看理解

一、ELF文件概览:

 

我们将图片以左右两边的箭头做分组它们分别代表了,ELF文件读取的两种不同视图,左侧为链接视图,是ELF文件由链接角度的解读,右侧为执行视图,是ELF文件由执行或加载(dlopen())角度的解读。由上图可知我们可以将一个ELF文件分为4部分:

  1. ELF Header 整个ELF的文件头 用于描述整个文件的概况
  2. Program Header Table:用于描述各Segment所包含的属性信息操作系统在执行过程中通过这些信息在进程所属的逻辑内存中分配内存并为这些内存添加对应的操作权限。
  3. Sections or Segments 因为解读的不同此处可以被解读为Sections或者Segments 虽解读方式不同但在进程中指向相同的内存,故此处先用or解释关于二者之间的关系与异同我会在后面介绍
  4. Section Header table 包含了文件中不同的section的定义信息,除此之外从执行视图来看,Section Header table也是一个Segment 属性为Dynamic

在讲解Section和Segment的关系前我们先上一张图

 

由图请先对二者有一个清晰地认识,之后我们来逐条分析:

  1. 二者在解读方式不同时可以忽略对方:

因Section Segment的解读方式不同所以我们可以在用一种方式的解读中忽略另一种,例如在运行阶段可以忽略Section的存在,同理在链接阶段可以忽略Segment

     2.Segment在内存角度看包含section:

Program Hear中存储着Segment大小和操作权限的定义,故在加载阶段加载器通过这些定义来为系统分配内存和内存所属权限,如果有两个Section有着相同的权限需求那么完全可以放在同一个Segment中,所以我们可以推测Segment和Section在内存中为包含关系,结合逆向工具查看发现结论一致

     3.作用及定位不同:

Segment作为运行时结构并不需要过多的属性 只需要圈定大小及权限,剩下的交由线程进行执行即可,而Section作为链接时结构则需要为不同的Section圈定角色用于链接,其中用作函数导出、依赖函数重定位的几部分尤为重要

 

二、各部分定义分析

各种C语言类型的定义:

名称

大小

说明

Elf32_Addr

4

无符号程序地址

Elf32_Half

2

无符号中等整数

Elf32_Off

4

无符号文件偏移

Elf32_SWord

4

有符号大整数

Elf32_Word

4

无符号大整数

unsigned char

1

无符号笑整数

各部分定义,极简略想细看看结尾大图

  1. ELF Header:
typedef struct {
    unsigned char e_ident[16];  
    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_shstr
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值