【个人简单记录】PLT,GOT函数加载机制
PLT GOT 加载记录
以ARM64架构为例
1…text代码中调用
执行 .text:000000000002001C D5 A9 FF 97 BL .popen
2.跳转到.plt表,根据计算后,得到函数在got里面的地址
arm64计算的方法: got地址 = x16后面的数字(第一行) + add命令后面的数字
// --------------- [首次] ---------------
.text 代码调用 -> .plt (发现.got没有值---地址) -> 调用_dl_runtime_resolve(x16) 自动调用目标函数 -> 返回.text 代码调用处的下一条指令
// 首次: x17 存放 _dl_runtime_resolve 地址
ADD x16,x16,#偏移 // 存放函数在got表里的地址
// 并将x16作为参数传给
_dl_runtime_resolve 解析器函数// 写个最简单的理解
void _dl_runtime_resolve(long got地址){// 自动识别要调用的函数名字 (如popen)// 获取so内 popen实际地址 (如libc.so)// 将 popen实际地址 存入 got地址 (popen在你自己写的代码里对应的全局函数地址)// 调用 popen (并将x0....参数传入,进行调用)// 跳转回 .text 代码调用处的下一条指令
}// --------------- [之后] ---------------
.text 代码调用 -> .plt (发现.got有值---地址) -> 根据.got存的地址 ->调用目标函数 -> 返回.text 代码调用处的下一条指令
IDA跳转到got看看
首次这里都是0
之后这里会变成目标函数地址
不知道这样能不能清晰一点,反正我感觉已经很清晰了(蓝色线–首次调用,红色线–第二次调用)