ELF文件主要有三种类型: (1)可重定位文件包含了代码和数据.可与其它ELF文件建立一个可执行或共享的文件. (2)可执行文件时可直接执行的程序. (3)共享目标文件包括代码和数据.  
这里主要分析一下第1种ELF的文件格式,这东西主要由ELF文件头和具体的各个节区组成.我们
可以通过readelf命令来详细查看ELF文件的各个节区.下面简要介绍一下各个部分的结构

1.ELF文件头
  内核中对ELF文件头 的结 构(32位机)定义在include/linux/Elf.h中

#define EI_NIDENT    16

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文件头用来描述整个文件的组织,对可重定位的目标文件而言重要的字段有:文件类型

( e_type) ,节区头部偏移( e_shoff ),文件头大小(e_ehsize),节区头部表表项的大小
(e_shentsize),表项的个数(e_shnum),以及链接的字符节区的索引(e_shstrndx)等信息
2.各个节区
 A.节区头部表
 节区头部表中包含若干个表项,每一个表项都是对本ELF文件中的某个节区的描述,
下面是内核中定义的节区头部表项的数据结构

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

其中sh_name是被描述的节区的名字,这个值实际是 字符串节区的索引,可以理解为指向

实际的名字的指针;sh_type是节区的类型,一般有字符串节区,符号节区,重定位节区等;sh_flags
表示的是此节区中包含的内容是修改(SHF_WRITE),执行(SHF_EXECINSTR)或分配空间
(SHF_ALLOC); sh_offset和sh_size是定位被描述的节区在此ELF文件中的位置和大小;sh_link一般
表示被描述的节区需要链接的其他节区的索引,这个字段和sh_info一样根据具体的节区被用于表示不
同的含义.
 B.字符串表 (sh_type=SHT_STRTAB)
 此节区 就是把ELF中将要用到的字符串以'\0'分隔,存到一个连续的区域而成的.
其他节区中需要表示字符串时 一律用字符串表的索引来表示.值得注意的是字符串表可能有多个,因
此其他节区在引用字符串时不只要提供表内的索引,而且还需要提供表的索引.
 C.符号表(sh_type=SHT_SYMTAB)
 ELF文件为符号表由一个个符合表项构成,每个符号表项用来定位、重定位程序中
符号定义和引用的信息,符号表项数据结构如下
 

typedef struct elf32_sym{
  Elf32_Word    st_name;
  Elf32_Addr    st_value;
  Elf32_Word    st_size;
  unsigned char st_info;
  unsigned char st_other;
  Elf32_Half    st_shndx;
} Elf32_Sym

/*st_info*/

#define ELF32_ST_BIND(x) ((x) >> 4)

#define ELF32_ST_TYPE(x) (((unsigned int) x) & 0xf)

其中,st_name是符号名,如前所述他是某个字符串表的表内索引,st_value可能是符号关

联的取值,有可能是符号的地址或符号的值;st_size应该就是符号 相关的尺寸大小,8位的st_info中
储存着两个信息.高4位名曰绑定信息 主要是描述的是符号是全局的(STB_GLOBAL),局部的
(STB_LOCAL),弱符号(STB_WEAK) 还是程序自定义的.低4位是符号的类型 主要描述的是这个符号是
变量(STT_OBJECT),函数(STT_OBJECT)还是其他类型的符号.
 D.重定位表
 重定位表中的每个表项都包含了如何修改某个目标项的信息,一般,同一个重定位表中的表
项都是描述同一个节区中符号的修改信息.下面是重定位表项的数据结构:

typedef struct elf32_rel {
  Elf32_Addr    r_offset;
  Elf32_Word    r_info;
} Elf32_Rel;

typedef struct elf32_rela{
  Elf32_Addr    r_offset;
  Elf32_Word    r_info;
  Elf32_Sword   r_addend;
} Elf32_Rela

/* The following are used with relocations */

#define ELF32_R_SYM(x) ((x) >> 8)

#define ELF32_R_TYPE(x) ((x) & 0xff)

其中,r_offset表示的 是从 节区头部开始到将被重定位影响的存储单位之间的字节偏移 即

指明了重定位操作的实施位置;r_info也包含两个信息 一为重定位类型(低8位) 即指明了重定位操作
的方法,二为被实施重定位的符号索引(高24位) 即指明了操作的实施对象.下表是x86结构下重定位操
作的类型和说明.
 x86体系结构下重定位类型

名称

数值

字段

计算

说明

R_386_NONE

0

(无)

(无)

R_386_32

1

word32

S+A

R_386_PC32

2

word32

S+A-P

R_386_GOT32

3

word32

G+A-P

此重定位类型计算从全局偏移表基址到符号的全局偏移表项之间的距离。它会通知连接编辑器构造一个全局偏移表。

R_386_PLT32

4

word32

转载于:https://my.oschina.net/alphajay/blog/4957

可重定位的ELF文件相关推荐

  1. Linux下的ELF文件、链接、加载与库(含大量图文解析及例程)

    Linux下的ELF文件.链接.加载与库 链接是将将各种代码和数据片段收集并组合为一个单一文件的过程,这个文件可以被加载到内存并执行.链接可以执行与编译时,也就是在源代码被翻译成机器代码时:也可以执行 ...

  2. linux 内核重定位,Linux 内核学习笔记:预备知识之“目标文件”

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 本文主要阐述 Linux 的目标文件(有可重定位目标文件.可执行目标文件和共享目标文件三种形式),并把重点放在其格式和案 ...

  3. c语言书籍elf文件,扒一扒ELF文件

    ELF文件(Executable Linkable Format)是一种文件存储格式.Linux下的目标文件和可执行文件都按照该格式进行存储,有必要做个总结. 1. 链接举例 2. ELF文件类型2. ...

  4. elf文件格式_Android so(ELF) 文件解析

    Android so(ELF) 文件解析 Android so(ELF) 文件解析 前言 生成 so 文件 相关工具 objdump readelf 整体结构图 头部结构 段表结构 字符串表结构 程序 ...

  5. Android so(ELF) 文件解析

    文章目录 前言 生成 so 文件 相关工具 objdump readelf 整体结构图 头部结构 段表结构 字符串表结构 程序表结构 符号表结构 重定位表结构 其他结构 解析代码 打开 ELF 文件 ...

  6. C语言 目标文件和可执行文件(ELF文件)

    转自:https://www.jianshu.com/p/7c609b70acbd 1.C语言创建程序 1.1C语言创建(分为4个步骤) 编辑 编译 链接 执行 编辑:就是创建和修改C程序的源代码-我 ...

  7. 04可重定位目标文件ELF文件解析

    目录 一:可重定位目标文件的特点 二:可重定位目标文件的格式 一:可重定位目标文件的特点 •可被链接(合并)生成可执行文件或共享目标文件 •静态链接库文件由若干个可重定位目标文件组成 •包含代码.数据 ...

  8. Android的ELF文件重定位详解,包括64位

    0x01 引言 ELF文件格式,主要基于两种,一种是基于链接视图,链接视图即是基于节(Section)来进行解析,一种是基于执行视图,执行视图即是基于段(Segment)来进行解析.前一种是用于静态分 ...

  9. elf文件中代码段有绝对地址但重定位表中无.text.rel

    阅读<程序员的自我修改>第三章 中关于ELF 文件结构描述 关于重定位表 P79时候产生的问题. 文章中说只要有绝对地址的段,就会有重定位.但是readelf -S helloWorld. ...

  10. 《程序员的自我修养》读书笔记3——使用KEIL研究ELF文件的重定位

    空间和地址分配 仍然采用上一节的代码.看生成的代码段.3个中间目标文件的代码段: fromelf -v a.o============================================= ...

最新文章

  1. 关于清除浮动那些事儿~
  2. OpenMPI 安装
  3. 算法每日学打卡:java语言基础题目打卡(19-21)
  4. 使用 Feign 调用分页接口报错:Method has too many Body parameters(亲测)
  5. LAMP源代码编译整理
  6. 网络七层协议 五层模型 TCP连接 HTTP连接 socket套接字
  7. pytorch创建tensor
  8. FineUI小技巧(3)表格导出与文件下载
  9. 深度学习大厂前端项目开发全流程全流程
  10. 104. 字符串函数
  11. 前端开发写代码哪个软件更好用?
  12. 国产双模蓝牙芯片简介
  13. A problem has been detected and windows has been shut down to prevent damage to your computer.
  14. 【CSDN|每日一练】小艺的英文名
  15. I2S UDAl1380
  16. linux 系统基本设置
  17. android仿QQ优雅的修改App字体大小
  18. 2021高考汕头一中成绩查询,2021汕头市地区高考成绩排名查询,汕头市高考各高中成绩喜报榜单...
  19. 用计算机制作程序框图,流程图 结构图制作更轻松
  20. oracle 误删 log文件,Redo log文件被删除恢复

热门文章

  1. mssql2000跟mssql2005共享问题
  2. JSP与Servlet传值及对比
  3. php 页面跳转 url地址不变,【后端开发】php跳转页面url不变
  4. 编译OpenJDK8-u332:/bin/sh: 1: [: -a: unexpected operator/line 0: [: too many arguments
  5. ProGuard混淆时保留注释(@类内容)
  6. JAVA格式化输出浮点数:空格,位数
  7. 帮助朋友干活,平生第一次收到月饼
  8. 软件基本功:垃圾代码的共同特征
  9. 全网首发:WORD取消了光标的方向
  10. LINUX下载编译libopusenc-0.2.1.tar.gz