【发布时间】:2013-12-27 12:01:20
【问题描述】:
我很好奇为什么存在过程链接表。它的用途是什么?程序集不能直接调用全局偏移表吗?调用 PLT 比调用 Global Offset Table 有什么优势?
整个过程对我来说仍然有点困惑,我正试图弄清楚动态链接的进出,所以任何帮助都将不胜感激。
【问题讨论】:
-
那个问题根本没有回答我的问题
我很好奇为什么存在过程链接表。它的用途是什么?程序集不能直接调用全局偏移表吗?调用 PLT 比调用 Global Offset Table 有什么优势?
整个过程对我来说仍然有点困惑,我正试图弄清楚动态链接的进出,所以任何帮助都将不胜感激。
【问题讨论】:
对于从 PIC 代码进行的调用,您是正确的,PLT 并不是真正需要的。编译器可以很好地生成 GOT 查找并间接调用从 GOT 获得的地址。不过,使用 PLT 往往会使代码更高效(至少每次调用的体积膨胀较小),因此无论如何通常都会使用它。
然而,绝对需要 PLT 的地方是动态链接的非 PIC 代码。 (通常这只发生在主程序中;在许多拱门上,共享库中甚至不允许/支持非 PIC 代码。)当编译器为函数调用生成非 PIC 代码时,它无法知道实际目标地址将在运行时通过 GOT 动态解析。所以它只是生成一个普通的调用指令。然后,当链接器看到一个未在本地解析且需要运行时链接的符号的调用类型重定位时,链接器负责生成一个 PLT 条目,该条目从 GOT 加载地址并间接跳转到它。这样,原始的非 PIC 函数调用代码无需修改即可工作。
【讨论】: