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的更多相关文章

  1. elf文件中的.plt .rel.dyn .rel.plt .got .got.plt的关系

    .plt的作用是一个跳板,保存了某个符号在重定位表中的偏移量(用来第一次查找某个符号)和对应的.got.plt的对应的地址 .rel.dyn重定向表,在程序启动时就需要重定位完成. .rel.plt保 ...

  2. plt和got

    最近在学习linux高级调试技术.下面就动态库连接这块做了一个实验 首先理解下plt是procedure linkage table,got是global offset table.got表中存放的是 ...

  3. 动态链接库中函数的地址确定---PLT和GOT [转]

    前面写过动态链接库 延迟绑定的一篇博文,那篇文章我非常喜欢,但是当时刚搞清楚,自己写的比较凌乱,我最近学习了Ulrich Drepper的How to write share library,学习了几 ...

  4. (原)python中使用plt.show()时显示图像

    转载请注明出处: http://www.cnblogs.com/darkknightzh/p/6039667.html 参考网址: http://matplotlib.org/users/shell. ...

  5. 基于Android的ELF PLT/GOT符号和重定向过程ELF Hook实现(by 低端农业代码 2014.10.27)

    介绍 技术原因写这篇文章,有两种: 一个是在大多数在线叙述性说明发现PLT/GOT第二十符号重定向过程定向x86的,例<Redirecting functions in shared ELF l ...

  6. [Q]将图纸转换为JPG、PNG、plt、DWF、DWFx,XPS等格式文件

    如要将图纸打印为图片,请选择“PublishToWeb JPG.pc3”或“PublishToWeb PNG.pc3”打印机. 如要将图纸打印为plt格式文件,请选择“Windows Default ...

  7. PLT文件 和 DXF文件

    PLT: CAM/CAD类似软件处理的图像文件的文件格式 DXF: AutoCAD(Drawing Interchange Format或者Drawing Exchange Format) 绘图交换文 ...

  8. 深入了解GOT,PLT和动态链接

    之前几篇介绍exploit的文章, 有提到return-to-plt的技术. 当时只简单介绍了 GOT和PLT表的基本作用和他们之间的关系, 所以今天就来详细分析下其具体的工作过程. 本文所用的依然是 ...

  9. Linux Debugging(七): 使用反汇编理解动态库函数调用方式GOT/PLT

    本文主要讲解动态库函数的地址是如何在运行时被定位的.首先介绍一下PIC和Relocatable的动态库的区别.然后讲解一下GOT和PLT的理论知识.GOT是Global Offset Table,是保 ...

  10. ELF 文件 动态连接 - 延迟绑定(PLT)

    PLT 全称:Procedure Linkage Table ,直译:过程连接表 由于在动态连接中,程序的模块之间包含了大量的函数引用,所以在程序开始执行前,动态链接会耗费较多的时间用于模块之间函数引 ...

随机推荐

  1. 万能的一句话 json

    String str1 = new JavaScriptSerializer().Serialize(meetapply1);//meetapply1==object T

  2. Pandas处理丢失数据

    1.创建含NaN的矩阵 >>> dates = pd.date_range(', periods=6) >>> df = pd.DataFrame(np.arang ...

  3. Django的内置登录、退出、修改密码方法

    Django中内置的登录.退出.修改密码方法. 1.url.py中使用django.contrib.auth中的views函数,django.views.generic中的TemplateView函数 ...

  4. unbuntu 安装 teamviewer

    下载 teamviewer 安装包 使用 dpkg 安装 deb 安装包 使用 sudo apt-get install -f 解决依赖问题

  5. 移植U-Boot时遇到的问题

    1. 在lowlevel_init过程中,本来想实现一个串口直接打印字符串的过程,编译的时候出现了问题,说是发现代码执行段没有对齐:“unaligned opcodes detected in exe ...

  6. bzoj4556(sam)

    二分答案,(具体可见http://blog.csdn.net/neither_nor/article/details/51669114),然后就是判定问题,sa和sam都可以做,用sam写了一下,先用 ...

  7. VDD,VCC,VSS,VEE,VDDA,VSSA,

    VDD是主供电电源,也是IO口输出电平的输入电源.VDDA(A表示模拟)是模拟电源,当使用到模拟信号的时候,比如AD(模数)或者DA(数模)的时候,系统会使用VDDA的电压作为参考电压来.不要求精准使 ...

  8. winform判断一个事件是否已经绑定了事件处理函数

    public static class ComponentHelper<T> where T : Control { public static bool HaveEventHandler ...

  9. 突然 不能f**q

    ss 突然访问不了,于是去查看ip是否被f,发现国outer 国inner 都通,不知道什么情况,后来把 系统代理模式 改为全局,发觉可以,又把他改为 pac模式,正常了.           记录一 ...

  10. [Python列表]-索引

    Python 列表(List) 前言 序列是Python中最基本的数据结构.序列中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0,第二个索引是1,依此类推. Python有6个序列的内 ...