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