ZHCADC4A September 2011 – March 2014
完全位置无关意味着代码与自身位置无关,与自身数据的位置以及任何导入代码或数据的位置无关,无需在加载时进行重定位修补。在此上下文中,“自身”一词表示与引用同属于相同的静态链接单元。我们来看一看每种情况意味着什么:
为避免将位置相关绝对地址编码到代码段中,它们会生成到称为全局偏移表 (GOT) 的表中,该表是每个静态链接单元的数据段的一部分。程序不直接访问对象,而是从 GOT 读取符号的地址并间接对其寻址。GOT 是数据段的一部分,始终使用静态链接时固定的偏移量来进行 DP 相对寻址。它由链接器生成,以响应编译器发出的特殊 GOT 生成重定位。当地址已知时,GOT 中的地址会在动态链接时得到修补。
基于 GOT 的访问涉及两个存储器引用:一个从 GOT 加载地址,另一个引用变量本身。第一个引用将访问 GOT 自身,本质上与正常的 DP 相对数据访问相同(请参阅节 4.2.1)。绝大多数时候,我们期望 GOT 位于 near DP 段中,因此可以使用 near DP 相对寻址进行访问。