对于X86平台下的ELF文件的重定位入口所修正的指令寻址方式只有两种:绝对近址32寻址和相对近址32寻址。

这两种指令修正方式每个被修正的位置的长度都为32位,即4个字节,而且都是近址寻址,不用考虑Intel的段间远址寻址。r_info成员的低8位表示重定位入口的类型。

X86基本重定位类型

宏定义                        值      重定位修正方法

R_386_32      1     绝对寻址修正  S + A

R_386_PC32    2     相对寻址修正  S + A - P

A = 保存在指令中被修正位置的值

P = 被修正的位置(相对于段开始的偏移量或者虚拟地址),该值可以通过r_offset计算得到。

S = 符号的实际地址,即由r_info的高24位指定的符号的实际地址。

因为a.o中shared和swap需要地址重定位,以此为例子说明重定位地址修正方法。用objdump -r a.o可以得到a.o中需要重定位的符号如图4.2.7所示:

***图4.2.7(同4.2.4相同)***

从图中可知,shared的重定位类型为R_386_32,因此为绝对寻址修正方式。那么S的值怎么得到,可以从a.o,b.o链接成的可执行文件的符号表中得到,可执行文件的符号表如图4.2.8:

***图4.2.8***

从图中看出shared的实际地址为0x08049158,即是S的值。从a.o反汇编指令中可知A的值,如图4.2.9所示:

***图4.2.9***

从图4.2.7中得知shared相对段开始的偏移为0x15,所以A的值是0x0。那么shared重定位后的地址为S + A = 0x08049158 + 0x0 = 0x08049158。怎样验证该数值的正确性?可以通过可执行文件的反汇编代码验证,如图4.2.10所示:

***图4.2.10***

注意:图中的地址为小端格式,即数值的高位存放在低地址,低位在高地址。
而swap的重定位方式为相对寻址修正,swap的S值从图4.2.8中可知为0x080480c0,A的值为0xfffffffc,为-4的补码。P的值为符号swap的偏移量加上该段的起始地址,swap的偏移量为0x21,该段的起始地址符号main的地址,即为0x08048094。因此最终swap的地址为0x080480c0 - 0x04 - (0x08048094 + 0x21)= 0x07。从图4.2.10可以看到call指令被修正后的地址确实为0x07。而call指令的调用地址是修正后的地址加上下一条
指令的地址,0x07 + 0x080480b9 = 0x080480c0,该地址即为swap函数的地址。

***图4.2.11***

转载于:https://www.cnblogs.com/miaoyong/p/3505590.html

Chap-4 Section 4.2.4 指令修正方式相关推荐

  1. 记: 对于SCPI指令以及相同类型指令解析器的指令压缩方式

    0x10 前言 SCPI是一个对人或者说用户十分友好的语言,采用了人性化的抽象与对于用户很友善的组成方式. 但是对于某些机器的设计就会很难受,而且当前的机器会在日后的不停更新导致当前的程序越来越呈现一 ...

  2. 点火提前角的修正方式有哪些_“天问一号”完成第二次轨道中途修正:精度很高,本次修正量很小...

    "天问一号"完成第二次轨道中途修正:精度很高,本次修正量很小 来源:央视网 记者从国家航天局获悉,2020年9月20日23时,在我国首次火星探测任务飞行控制团队控制下,天问一号探测 ...

  3. 处理器不同编址方式、指令/数据处理方式区别

    每个外设都是通过读写其寄存器来控制的.外设寄存器也称为I/O端口,通常包括:控制寄存器.状态寄存器和数据寄存器三大类.根据访问外设寄存器的不同方式,可以把CPU分成两大类.一类CPU(如ARM,MIP ...

  4. Android中实现「类方法指令抽取方式」加固方案原理解析

    一.前言 Android中加固方案一直在进步,因为新的加固方案出来就会被人无情的破解脱壳了,从第一代加固方案落地加密dex文件,第二代加固方案不落地加密dex文件,在到第三代加固方案类方法抽取,以后后 ...

  5. 论文遇到的格式问题和修正方式

    word空格出现小圆点怎么办 论文参考文献批量改为上角标,简单好用!!! 字数统计网站 word封面下划线怎么对齐(非常简单+彻底解决)

  6. MIPS架构下LW指令的重定位过程

    通常我们不会去关心指令重定位(relocation)的细节,编译器的ld过程已经帮助我们做好了.由于最近在移植CRIU,涉及到指令的重定位计算,不得不细细研究代码重定位的细节知识.之前的文章介绍了MI ...

  7. ELF文件装载链接过程及hook原理

    ELF文件格式解析 可执行和可链接格式(Executable and Linkable Format,缩写为ELF),常被称为ELF格式,在计算机科学中,是一种用于执行档.目的档.共享库和核心转储的标 ...

  8. 程序员的自我修养阅读笔记

    编译和链接 将编译和链接合并到一起的过程称为构建(Build). 从源文件生成最终可执行目标文件共有4个步骤: 预处理(Prepressing) 编译(Compilation) 汇编(Assembly ...

  9. 程序员的自我修养_读书笔记

    1. 基本知识 1. 计算机系统 1.1 计算机系统的硬件部分 计算机最主要的三个部件:CPU.内存.I/O控制芯片. 早期的计算机中CPU和内存频率基本一致,两者直接连在一根总线上,I/O设备频率较 ...

最新文章

  1. CCF的A类期刊和会议有哪些?人工智能顶会ACL,ICML,NeurIPS,ICLR论文投稿时间以及影响因子等
  2. C语言编程之格式化输出函数printf()说明
  3. 燕京理工学院java期末_英华学堂燕京理工学院的答案
  4. 从一个实例看编程水平的步步提高
  5. 二叉搜索树的删除_LeetCode109.有序链表转换二叉搜索树
  6. 关于数组相关乱七八糟
  7. LESS是一个CSS预处理器,跨浏览器友好,提供诸如变量,函数, mixins 和操作等功能,可以构建动态CSS...
  8. Ext.form.field.Spinner微调字段
  9. Linux批量清空当前目录中的日志文件
  10. matlab钢琴音教程,弹琴吧 - 今天聊一聊钢琴扒带及MIDI制作,使用音
  11. jvisualvm监控远程服务器,Jvisualvm监控远程tomcat
  12. python爬网易云音乐评论最多的歌_Python爬取网易云音乐上评论火爆的歌曲
  13. EBS R12中SLA子分类帐与子模块的关联关系
  14. Android音频系统
  15. python微信公众号_python通过手机抓取微信公众号
  16. 京东 区块链 JDChain
  17. worldpress 添加网站关键词和描述
  18. Docker入门-常用指令总结与归纳
  19. 智能家居UI--灯光控制
  20. unity urp 棉麻织物渲染

热门文章

  1. LeetCode 1885. Count Pairs in Two Arrays(二分查找)
  2. 01.神经网络和深度学习 W2.神经网络基础(作业:逻辑回归 图片识别)
  3. LeetCode 432. 全 O(1) 的数据结构(设计题)*
  4. 剑指Offer - 面试题26. 树的子结构(双重递归)
  5. LeetCode 第 17 场双周赛(469/897,前52.3%)
  6. LeetCode 623. 在二叉树中增加一行(BFS/DFS)
  7. python scipy库函数solve用法_如何在中使用事件scipy.integrate.solve_ivp
  8. Java中用JS那些_java web中javascript主要用哪些?
  9. Java script生成apk_lua脚本实现自动生成APK包
  10. java listview控件_ListView普通列表控件的使用