GOT表和PLT表

GOT表是一个存储外部库函数的表
PLT则是有代码片段组成的,每个代码片段都跳转到GOT表中的一个具体的函数调用

重定位

链接时重定位

链接杰顿是将一个或多个中间文件(.o文件)通过链接器将它们链接成一个可执行文件主要做的事情有

对各个中间文件的同名section进行合并
代码段,数据段等进行地址分配
进行链接时重定位

两种情况:
如果在其他中间文件中已经定义了的函数,链接阶段可以直接重定位到函数地址

如果是在动态库中定义了的函数,链接阶段无法直接重定位到函数地址,只能生产额外的小片段代码,也就是PLT表,然后重定位到改代码片段

运行是重定位

运行后加载动态库,把动态库中的相应函数地址填入GOT表,由于PLT表示跳转到GOT表的这就构成了运行时重定位

延迟重定位

只有动态库函数在被调用时,才会进行地址解析和重定位工作,这时候动态库函数的地址才会被写入到GOT表项中
函数第一次被调用过程
在这里插入图片描述

第一步有函数调用跳入到PLT表中
第二步PLT表调到GOT表中
第三步由GOT表回跳到PLT表中,这时候进行压栈,把代表函数的ID压栈
第四步跳转到公共的PLT表项中
第五步进去到GOT表中
第六步_dl_runtime_resolve对动态函数进行地址解析和重定位
第七步把动态函数真实的地址写入到GOT表项中,然后执行函数并返回
解释一下dynamic段,link_mao和_dl_runtime_resolve
dynamic段:提供动态链接的信息,例如动态链接中各个表的位置

link_map:已加载库的链表,由动态库函数的地址构成的链表

_dl_runtime_resolve:在第一次运行时进行地址解析和重定位工作

函数再次被调用过程
在这里插入图片描述

第一步还是由函数调用跳入到PLT表
第二步跳入到GOT表中,由于这个时候该表项已经是动态函数的真实地址了,所以可以直接执行然后返回
总结

对动态函数的调用,第一次要经过地址解析和回写到GOT表项中,第二次直接调用即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值