动态链接
为了提高程序执行效率,编译器不会将所有函数代码放到程序段中。
一些C语言提供给库函数,采用动态链接的方式加载到程序中(外挂)。
需要注意的是,考虑到效率,程序只会将用到的函数加载。
PLT表和GOT表
定义
PLT表又名程序链接表(Procedure Link Table)。
GOT表又名全局偏移表(GOT,Global Offset Table)。
作用
当程序执行到某个库函数的时候,例如puts。
程序会跳转到对应函数的PLT表位置,PLT表中包含了跳转到GOT表的命令。
而GOT表则存储了函数的真实地址。
为什么库函数不能直接跳转到GOT表去执行呢?
这是因为,GOT表初始并没有函数的真实地址,由于程序只会将用到的函数加载,并且如果在程序开始的时候就将所有函数加载会降低程序执行效率。所以采用了延迟绑定机制:
- 第一次执行函数时,plt表中的命令会去动态链接库中搜索函数地址并存入GOT。
- 再次执行时,会依次跳转到函数真实地址:函数 -> PLT表 -> GOT表 -> 执行。