参考文章:
聊聊Linux动态链接中的PLT和GOT(1)——何谓PLT与GOT
聊聊Linux动态链接中的PLT和GOT(2)——延迟重定位
聊聊Linux动态链接中的PLT和GOT(3)——公共GOT表项
动态链接
在 Linux 中,库(library)是预编译的可重用代码的集合,它可以在不同的程序中使用。
有两种类型的库:静态库和动态库。
静态库在程序编译时被静态链接进可执行文件中,而动态库在程序运行时被动态加载到内存中
plt和got表
以下内容来自chen爷的博客
这里举一个简单的例子
某公司开发了一款软件,实现的代码调用了大量的函数,这些函数的每次实现都需要在文件(这个软件)中对应的前置来实现他
这样子就增大了文件的体积
但是如果将实现这些函数的前置在程序运行时载入到内存中呢?
这样每一款软件都无需额外的内存占用,并且用户也能成功运行
所以这里就出现了plt表和got表的概念
当我们需要调用system函数时,他会去自动寻找system的plt表
其plt表中存储了system函数的got表的地址
其就是system在libc(libc同样在谢师傅的视频中有所介绍)中的地址
但是我们在第一次调用system函数的时候,其got表中的地址并不知道system在libc中的哪里
于是第一次调用无果后,system的plt表便会收到消息,去给got表找到system在libc的位置
经过原定好的代码实现,plt表便查找到了libc中system的地址,并将其填充给了got表
接下来plt表再去got表中,他就得知了地址,就可以成功调用system函数
所以我们可以将整个流程用下图来展示
而在之前程序已经调用了system函数进行echo 字符串,所以我们此时再去system的plt表中就能获取到system在libc中的地址
这里你可能会无法理解,但是在初期的学习我们只需要记住,plt表是调用该函数,got表中存的地址是为了获得真实地址