动态链接

为了提高程序执行效率,编译器不会将所有函数代码放到程序段中。

一些C语言提供给库函数,采用动态链接的方式加载到程序中(外挂)。

需要注意的是,考虑到效率,程序只会将用到的函数加载。

PLT表和GOT表

定义

PLT表又名程序链接表(Procedure Link Table)

GOT表又名全局偏移表(GOT,Global Offset Table)

作用

当程序执行到某个库函数的时候,例如puts。

程序会跳转到对应函数的PLT表位置,PLT表中包含了跳转到GOT表的命令

而GOT表则存储了函数的真实地址

为什么库函数不能直接跳转到GOT表去执行呢?

这是因为,GOT表初始并没有函数的真实地址,由于程序只会将用到的函数加载,并且如果在程序开始的时候就将所有函数加载会降低程序执行效率。所以采用了延迟绑定机制

  • 第一次执行函数时,plt表中的命令会去动态链接库中搜索函数地址并存入GOT
  • 再次执行时,会依次跳转到函数真实地址:函数 -> PLT表 -> GOT表 -> 执行。