动态链接(下):延迟绑定与动态链接器

123 阅读1分钟

patch code 技术

对于一个 class 文件,只有当 hotspot 第一次使用它的时候,它才会被加载进来。

在即时编译 A 方法的时候要调用 B 方法,但这时 B 方法还没有被加载进来,该怎么办呢? image.png

延迟绑定技术

将函数地址的重定位工作一直推迟到第一次访问的时候再进行,这就是延迟绑定 (Lazy binding) 的技术。

patch code 显然也是一种延迟绑定的技术,但是它要在运行时修改指令参数,这会带来风险。所以动态库的延迟绑定选择了继续使用 GOT 表来进行间接调用,然后 patch 的对象就不再是指令了,而是 GOT 中的一项。

image.png

为了解决传递参数的问题,动态链接又引入了过程链接表(Procedure Linkage Table, PLT),将动态解析符号的过程做成了三级跳。如下图所示:

image.png

多级跳转的延迟绑定技术的整个重定位过程最终只会修改 GOT 的 0x18 这一个位置,其他位置都不必发生变化。

真正负责动态链接的是 ld-linux.so,它被称为动态链接器,但因为它还负责加载文件工作,所以也被人称为加载器或者 loader。它的工作流程主要有启动,加载,重定位和 init 四个步骤。

image.png

此文章为7月Day8学习笔记,内容来源于极客时间《编程高手必学的内存知识》