我很好奇为什么程序链接表存在。它的用途是什么?程序集无法直接调用全局偏移表吗?调用PLT有什么优势可以调用全局偏移表?
整个过程仍然让我感到困惑,我正在试图弄清楚动态链接的进出,所以任何帮助都会受到赞赏。
我很好奇为什么程序链接表存在。它的用途是什么?程序集无法直接调用全局偏移表吗?调用PLT有什么优势可以调用全局偏移表?
整个过程仍然让我感到困惑,我正在试图弄清楚动态链接的进出,所以任何帮助都会受到赞赏。
对于使用PIC代码进行的调用,您确实不需要PLT。编译器可以很好地生成GOT查找和间接调用从GOT获得的地址。使用PLT往往会使代码略微提高效率(至少每次调用的大小膨胀),因此无论如何通常都会使用它。
然而,绝对需要PLT的地方是非PIC代码,它是动态链接的。 (通常这只发生在主程序中;在许多arch中,共享库中甚至不允许/不支持非PIC代码。)当编译器为函数调用生成非PIC代码时,它无法知道实际目标地址将在运行时通过GOT动态解析。所以它只是生成一个普通的调用指令。然后链接器负责,当它看到一个未在本地解析并需要运行时链接的符号的调用类型重定位时,用于生成一个PLT条目,该条目从GOT加载地址并间接跳转到它。这样,原始的非PIC函数调用代码可以不加修改地工作。