对于延迟绑定技术还是不太了解适宜看一下这篇文章
延迟绑定绑定技术就是Linux下ELF程序在调用函数时动态链接的方式。为了优化内存,加快运行速度等等原因,ELF程序运用了这样的技术来调用函数。
简单的说就是程序在调用函数时先jmp fun@plt 进入plt表。接着jmp fun@got,这时候的got表中并没有存储函数真实的地址。程序到这里需要调用_dl_runtime_resolve这个函数。通过这个函数再填充got表然后在下一次调用fun的时候进入真正的函数地址。
下面的划重点
_dl_runtime_resolve这个函数在got[2]中,而got[0]got[1]分别是.dynamic和link_map。这两项可以理解为在调用_dl_runtime_resolve时候需要准备的。
在函数第一次调用的时候到got表中需要准备_dl_runtime_resolve的参数。首先jmp回plt表的一个位置。接着push 0x20,在栈上准备调用函数的参数。然后jmp到plt表的另一个地方push link_map的地址,这里也是在准备参数。后面jmp got[2] 调用_dl_runtime_solve对got表进行填充。下次再次调用函数时直接jmp .plt jmp .got进入函数真实地址
附上大佬对于_dl_runtime_solve的原理讲解的链接。
_dl_runtime_solve