目录

一:可重定位目标文件的特点

二:可重定位目标文件的格式


一:可重定位目标文件的特点


•可被链接(合并)生成可执行文件或共享目标文件

•静态链接库文件由若干个可重定位目标文件组成

•包含代码、数据(已初始化全局变量和局部静态变量.data和未初始化的全局变量和局部静态变量.bss)

•包含重定位信息(指出哪些符号引用处需要重定位)

•文件扩展名为.o(相当于Windows中的.obj文件)

我们都知道可重定位目标文件都是用来进行链接生成可执行目标文件的,那么下面我们来看下相应的链接试图,看看可重定位目标文件中都包含什么信息,下图是一个简单的举例,一起来看下吧。

通过上面的图片我们可以看出ELF文件主要包含了text,data,bss节,之前的文章对这些节的内容也做了简单的介绍,具体可以翻看之前的内容。要想进行连接,除了这几个节之前还需要其他的信息,比如符号表,重定位信息等等,这些后面会一一介绍。这里我们先介绍下为什么会有BSS节。

•C语言规定:

– 未初始化的全局变量和局部静态变量的默认初始值为0

• 将未初始化变量(.bss节)与已初始化变量(.data节)分开的好处

– .data节中存放具体的初始值,需要占磁盘空间

– .bss节中无需存放初始值,只要说明.bss中的每个变量将来在执行时占用几个字节即可,

因此,.bss节实际上不占用磁盘空间,提高了磁盘空间利用率

• BSS 中所用的一个 (Block Started by Symbol)最初是UA-SAP汇编程序伪指令,用于为符号预留一块内存空间

• 所有 通过专门的 未初始化的全局变量和局部静态变量 “节头表(Section header table)”

都被汇总到.bss节中,来说明应该为.bss节预留多大的空间

二:可重定位目标文件的格式


上面讲了可重定位目标文件有text,data,bss节,除了这些内容还有其他的重要信息,下面我们一起来探讨一下吧。

从上面的图中我们可以看到可执行目标文件包含的内容有很多,下面我们一一进行分析

1:ELF头

ELF头位于ELF文件开始,包含文件结构说明信息。分32位系统对应结构和64位系统对应结构(32位版本、64位版本)。包括16字节标识信息、文件类型 (.o,exec, .so)、机器类型(如 IA-32)、节头表的偏移、节头表的表项大小以及表项个数。

我们以32为操作系统做举例,其对应的数据结构如下所示:

#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;

定义了ELF魔数、版本、小端/大端、操作系统平台、目标文件的类型、机器结构类型、程序执行的入口地址、程序头表(段头表)的起始位置和长度、节头表的起始位置和长度等

其中魔数在文件开头的几个字节中,通常是用来确定 文件的类型和格式的,加载或读取文件的时候可以用魔数来确定文件的类型是否正确。

a.out的魔数:01H 07H

PE格式魔数:4DH 5AH

2:.text 节

编译后的代码部分

3:.rodata 节

只读数据,如 printf 格式串、switch跳转表等

4:.data 节

已初始化的全局变量

5:.bss 节

未初始化全局变量,仅是占位符,不占据任何实际磁盘空间。区分初始化和非初始化是为了空间效率

6:.symtab 节

存放函数和全局变量 (符号表)信息 ,它不包括局部变量

7:.rel.text 节

.text节的重定位信息,用于重新修改代码段的指令中的地址信息

8:.rel.data 节

.data节的重定位信息,用于对被模块使用或定义的全局变量进行重定位的信息

9:.debug 节

调试用符号表 (gcc -g)

10:strtab 节

包含symtab和debug节中符号及节名Section header table(节头表)每个节的节名、偏移和大小

11:Section header table(节头表)

每个节的节名、偏移和大小

上面这些就是可重定位目标文件包含的信息了,其中Section header table(节头表)表述就是每个节所占据的地址空间大小了。

上图中就是节头表的信息举例,使用readelf -S test.o命令可以查看,其中Addr例表述的是每个节映射到虚拟地址的位置,因为可重定位目标文件还没有经过链接过程,所以该例都是0,经过链接过程之后才会将各个节映射到虚拟地址上去。

上述各个节中有4个节会被分配存储空间,其他的节在系统真正运行的时候是不会分配存储空间的。

.text:可执行

.data和.bss:可读可写

.rodata:可读

04可重定位目标文件ELF文件解析相关推荐

  1. Ubuntu16.04中的可重定位目标文件

    最近在看<CSAPP>这本神书,其中看到了第七章链接中的可重定位目标文件,自己动手在ubuntu16.04上试了一试,发现有很多都做了一些改动,在此记录 1.源程序 main.c stat ...

  2. 关于可重定位目标文件的格式与其符号表的概述

            我们知道一个可执行的C程序要经过语言预处理.编译器.汇编器生成扩展名为.o的可重定位目标文件,再通过链接器链接生成可执行的目标文件. 1.什么是可重定位目标文件        一个扩展 ...

  3. 可重定位目标文件(REL)的符号和符号表

    可重定位目标文件由汇编器as生成,包含了当前模块定义的符号及引用的外部模块符号信息,可以与其他可重定位目标文件链接为一个可执行目标文件. 有三种不同类型的符号,第一种,由当前模块定义的全局符号:第二种 ...

  4. ELF文件系列第三篇ELF文件静态结构中的节

    节概述 在ELF文件中可以包含很多"节"(section),所有这些"节"都记录在一张称为"节头表"(section header tabl ...

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

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

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

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

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

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

  8. PE文件-手工修改重定位表-WinHex-CFF Explorer

    文章目录 1.CFF Explorer 2.计算添加后的重定位大小 3.作者答疑 1.CFF Explorer   如果需要修改exe,dll等的二进制代码,遇到添加绝对地址时,需要将绝对地址的位置添 ...

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

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

最新文章

  1. 近900000条if-then关系图谱,让神经网络“懂”常识推理
  2. 30道四则运算题目---课堂作业--软件工程c++
  3. 苹果CMS V10 播放记录_苹果cms新手入门安装配置教程
  4. 取消myeclipse2017的Dashboard页面
  5. c语言中有哪些函数关系,C语言中有哪些常用的函数
  6. JAVA 正则表达式 RegexUtil
  7. C++中new和malloc
  8. 快速搭建react项目骨架(按需加载、redux、axios、项目级目录等等)
  9. 舰船目标检测的学习笔记
  10. LightOJ 1336 Sigma Function 算数基本定理
  11. Python 中使用 ImageJ 详细教程
  12. 随机效应估算与固定效应估算_固定效应还是随机效应——Hausman检验.PPT
  13. ESD防护为何对集成电路如此重要?又该如何防护?
  14. linux su 资源不可用,CentOS 6/Linux su: 无法设置用户ID: 资源暂时不可用
  15. python模拟鼠标键盘操作_python3实现复制粘贴 Python-模拟鼠标键盘动作 | 猴头客
  16. Excel 固定显示表头 / 列头
  17. ip地址的分类和特殊的网络地址-——计算机网络笔记
  18. softer-nms论文学习详解(Bounding Box Regression with Uncertainty for Accurate Object Detection)
  19. python 禁用网卡_C#语言实现定时开启或禁用网卡小程序
  20. 海尔集团的的具体营销策略和营销管理

热门文章

  1. SpringCloud配置之:Turbine聚合监控
  2. Springboot中使用Mybatis框架对数据库进行联表查询,踩坑填坑
  3. 前端特效【第04期】|果汁混合效果-下
  4. 中国电信张东:数据治理与城市感知网的建设与运营
  5. 自动填充短信验证码实现方式
  6. 穿错衣服毁掉面试? 面试着装禁忌你注意到了吗?
  7. John Z. Sonmez(约翰 Z.森梅兹【美】)之《软技能:代码外的生存指南》
  8. Wireshark抓包iOS入门教程
  9. 9-19作业-宋俊杰
  10. 学计算机投影仪定义,主编教您电脑如何连接投影仪