Linker 符号重新定位

Linker 符号重新定位,linker,symbols,relocation,Linker,Symbols,Relocation,下面是如何在PIC中解析第一次函数调用 跳转到我们符号的PLT条目。 跳转到我们符号的入口。 跳回PLT条目并在堆栈上推一个偏移量。那 偏移量实际上是一个Elf_Rel结构,描述如何修补符号。 跳转到PLT存根条目。 将指针推送到链接映射结构,以便链接器 查找符号所属的库。 调用解析器例程。 修补已获得的条目。 这与仅使用GET表进行数据引用的方式不同 那么,为什么会有这种差异呢?为什么有两种不同的方法 为什么会有这种差异?为什么有两种不同的方法 你所描述的是懒惰的重新安置 您不必使用它,如果在

下面是如何在PIC中解析第一次函数调用

跳转到我们符号的PLT条目。 跳转到我们符号的入口。 跳回PLT条目并在堆栈上推一个偏移量。那 偏移量实际上是一个Elf_Rel结构,描述如何修补符号。 跳转到PLT存根条目。 将指针推送到链接映射结构,以便链接器 查找符号所属的库。 调用解析器例程。 修补已获得的条目。 这与仅使用GET表进行数据引用的方式不同

那么,为什么会有这种差异呢?为什么有两种不同的方法

为什么会有这种差异?为什么有两种不同的方法

你所描述的是懒惰的重新安置

您不必使用它,如果在环境中设置了LD_BIND_NOW=1,则不会使用它

这是一种优化:当一个特定的程序调用没有执行许多可能的程序执行路径时,它允许您减少动态链接器必须执行的工作量

设想一个程序可以根据参数调用foo、bar或baz,并且在任何给定的执行中只调用一个例程

如果不使用延迟重定位,动态加载程序将必须在程序启动时解析所有3个例程。延迟重定位允许dynamic loader只在调用函数的正确时间执行任何给定执行中实际需要的一个重定位,即调用一个函数

现在,为什么变量不能用这种方法来解决呢

因为动态加载程序无法方便地知道何时执行重新定位


假设全局变量是a、b和c,foo引用a和b,bar引用b和c,baz引用a和c。理论上,动态加载器可以扫描foo、bar和baz的主体,并构建if调用foo的映射,然后还可以解析globals a和b等。但在启动时解析所有对globals的引用要简单得多,也要快得多

请不要将无关的问题分组。问两个独立的问题不需要额外的费用。谢谢你的回答。我最近问了一个与这个主题相关的问题,但没有得到任何回应。你能看一下吗?关于第二个问题,我将按照你的建议为它写一篇新文章。Thnx