问题 程序链接表的目的是什么?


我很好奇为什么程序链接表存在。它的用途是什么?程序集无法直接调用全局偏移表吗?调用PLT有什么优势可以调用全局偏移表?

整个过程仍然让我感到困惑,我正在试图弄清楚动态链接的进出,所以任何帮助都会受到赞赏。


8835
2017-12-10 05:03


起源

可能重复 流程链接表和全局偏移表 - Some programmer dude
这个问题根本没有回答我的问题 - Rell3oT


答案:


对于使用PIC代码进行的调用,您确实不需要PLT。编译器可以很好地生成GOT查找和间接调用从GOT获得的地址。使用PLT往往会使代码略微提高效率(至少每次调用的大小膨胀),因此无论如何通常都会使用它。

然而,绝对需要PLT的地方是非PIC代码,它是动态链接的。 (通常这只发生在主程序中;在许多arch中,共享库中甚至不允许/不支持非PIC代码。)当编译器为函数调用生成非PIC代码时,它无法知道实际目标地址将在运行时通过GOT动态解析。所以它只是生成一个普通的调用指令。然后链接器负责,当它看到一个未在本地解析并需要运行时链接的符号的调用类型重定位时,用于生成一个PLT条目,该条目从GOT加载地址并间接跳转到它。这样,原始的非PIC函数调用代码可以不加修改地工作。


9
2017-12-10 05:10



大!最后一个问题。如果没有PLT,GOT在PIC代码中必须做些什么?更具体地说......为什么会更臃肿? - Rell3oT
只要它通过PLT,来自PIC代码的调用通常看起来与来自非PIC代码的调用相同,即单个PC相对调用指令。 (可能还有其他要求已加载GOT寄存器;这是特定于arch的。)通过GOT调用而不使用PLT与内联通常在PLT条目中的代码相同,这通常是2-3指令加载实际的功能地址并跳转到它。 - R..
好吧,这就是我的想法。我想在大量不同的函数被调用的情况下,体积会相当大,所以有两个不同的“层”调用以便更好地理解它是很好的。谢谢 - Rell3oT