got & plt
got plt类似与Windows PE文件中IAT(Import Address Table)。
要使的代码地址无关,基本思想就是把与地址相关的部分放到数据段里面。
ELF的做法是在数据段里面建立一个指向这些变量的指针数组,称为全局偏移表(Global Offset Table,GOT),当代码需要引用该全局变量时,可以通过GOT中相对应的项间接引用。
GOT本身是放在数据段,所以可以在模块加载时被修改。延迟绑定,基本思想就是当函数第一次被用到时才进行绑定
一段非常简单的代码:
#include <stdio.h>
#include <stdlib.h> int helloWorld(){
printf("HelloWorld\n");
return ;
} int main(){
helloWorld();
return ;
}


第一条指令是通过GOT间接跳转的指令。如果连接器在初始化阶段已经初始化该项,并且将puts()的地址填充入该项,那么这个跳转指令的结果就是我们所期望的,跳转到puts(),实现函数正确调用。
但是为了实现延迟绑定,链接器在初始化阶段并没有将puts()的地址填入该项,而是将下一条指令的地址填入到put@got.plt项中。
所以第一条指令的效果是跳转到第二条指令,相当于是没有任何操作的。第二条指令是将一个数字n压入堆栈,这个数字是puts()的符号引用在重定位表".rel.plt"中的下标。
接着又是一条push指令将模块ID压入到堆栈,然后跳转到0xf7ff04f0执行,那么这个地址是什么地址?答案是_dl_runtime_resolve,下文会给出解释。


ELF将GOT拆分为两个表,".got"和".got.plt"。其中".got"用来保存全局变量引用的地址,“.got.plt”用来保存函数引用的地址,对于外部函数的引用全部放在".got.plt"中。


通过上面两幅图可以看出:R_386_GLOB_DAT是位于.got段的,R_386_JUMP_SLOT位于.got.plt 段。
".got.plt"前三项是有特殊意义的。
第一项保存的是“.dynamic”段的地址;
第二项保存的是本模块的ID,也就是之前看到的push进的那个值;
第三项保存的是_dl_runtime_resolve()函数的地址,之前跳转的地址0xf7ff04f0。
之后就是地址,可以看到都是指向.plt段中,在链接时,.plt段通常和代码段等一起合并成一个可读可执行的Segment。

可以看到puts@plt的地址0x80482f6位于.plt 中。而且puts在got表项中存放的地址0x080482f6就是puts@plt第二条指令的地址。

参考资料:
《程序员的自我修养》动态链接
《深入理解计算机系统》第七章,链接
got & plt的更多相关文章
- elf文件中的.plt .rel.dyn .rel.plt .got .got.plt的关系
.plt的作用是一个跳板,保存了某个符号在重定位表中的偏移量(用来第一次查找某个符号)和对应的.got.plt的对应的地址 .rel.dyn重定向表,在程序启动时就需要重定位完成. .rel.plt保 ...
- plt和got
最近在学习linux高级调试技术.下面就动态库连接这块做了一个实验 首先理解下plt是procedure linkage table,got是global offset table.got表中存放的是 ...
- 动态链接库中函数的地址确定---PLT和GOT [转]
前面写过动态链接库 延迟绑定的一篇博文,那篇文章我非常喜欢,但是当时刚搞清楚,自己写的比较凌乱,我最近学习了Ulrich Drepper的How to write share library,学习了几 ...
- (原)python中使用plt.show()时显示图像
转载请注明出处: http://www.cnblogs.com/darkknightzh/p/6039667.html 参考网址: http://matplotlib.org/users/shell. ...
- 基于Android的ELF PLT/GOT符号和重定向过程ELF Hook实现(by 低端农业代码 2014.10.27)
介绍 技术原因写这篇文章,有两种: 一个是在大多数在线叙述性说明发现PLT/GOT第二十符号重定向过程定向x86的,例<Redirecting functions in shared ELF l ...
- [Q]将图纸转换为JPG、PNG、plt、DWF、DWFx,XPS等格式文件
如要将图纸打印为图片,请选择“PublishToWeb JPG.pc3”或“PublishToWeb PNG.pc3”打印机. 如要将图纸打印为plt格式文件,请选择“Windows Default ...
- PLT文件 和 DXF文件
PLT: CAM/CAD类似软件处理的图像文件的文件格式 DXF: AutoCAD(Drawing Interchange Format或者Drawing Exchange Format) 绘图交换文 ...
- 深入了解GOT,PLT和动态链接
之前几篇介绍exploit的文章, 有提到return-to-plt的技术. 当时只简单介绍了 GOT和PLT表的基本作用和他们之间的关系, 所以今天就来详细分析下其具体的工作过程. 本文所用的依然是 ...
- Linux Debugging(七): 使用反汇编理解动态库函数调用方式GOT/PLT
本文主要讲解动态库函数的地址是如何在运行时被定位的.首先介绍一下PIC和Relocatable的动态库的区别.然后讲解一下GOT和PLT的理论知识.GOT是Global Offset Table,是保 ...
- ELF 文件 动态连接 - 延迟绑定(PLT)
PLT 全称:Procedure Linkage Table ,直译:过程连接表 由于在动态连接中,程序的模块之间包含了大量的函数引用,所以在程序开始执行前,动态链接会耗费较多的时间用于模块之间函数引 ...
随机推荐
- ES之五:ElasticSearch聚合
前言 说完了ES的索引与检索,接着再介绍一个ES高级功能API – 聚合(Aggregations),聚合功能为ES注入了统计分析的血统,使用户在面对大数据提取统计指标时变得游刃有余.同样的工作,你在 ...
- AX_NumberSeq
NumberSeq::newGetNum(NumberSeqReference::findReference(typeId2ExtendedTypeId(typeid(InventTransId))) ...
- Linux 第五天
网络命令 1)write 给在线用户发信息(需按Crtl+D保存结束,w命令可看在线用户) 语法:write 用户名 2)wall 发广播信息 英文原意:write all 语法:wall 信息 3) ...
- ABP框架系列之三十一:(Localization-本地化)
Introduction Any application has at least one language for user interface. Many applications have mo ...
- 【慕课网实战】Spark Streaming实时流处理项目实战笔记十三之铭文升级版
铭文一级: 第10章 Spark Streaming整合Kafka spark-submit \--class com.imooc.spark.KafkaReceiverWordCount \--ma ...
- Python脱产8期 Day014 2019/4/28
一 带参装饰器 1.通常,装饰器为被装饰的函数添加新功能,需要外界的参数 # -- outer参数固定一个,就是func # -- inner参数固定同被装饰的函数,也不能添加新参数 # -- 可以借 ...
- Increasing Subsequence (hard version)
首先讲一下题目大意:给你n个数,然后从最左边(L)或者最右边(R)取一个数生成出一个新的序列,对于这个序列的要求是递增的(注意是递增的,不能存在等于的情况)问这个序列有多长.并打印此操作. 这题就是忘 ...
- SpringDataSolr 过滤(或者叫筛选)查询
// 被本类调用 private Map searchList(Map searchMap) { // 1.1关键字查询 SimpleHighlightQuery highlightQuery = n ...
- JavaScript中关于页面URL地址的获取
1 window.location.host; //返回url的主机部分,例如 www.xxx.com window.location.hostname; //返回url的主机名,例如 www.xxx ...
- React.js 三周 -- 入门到搭建团队基础项目
吐槽 公司自己的产品,由于历史遗留问题,前端一直是和java放到一个项目里写的. 导致了,前端就被死死的绑在了IDEA战车上.想要看页面效果,先起几个java服务.想要调试一个改动,重启个java服务 ...