【问题标题】:What is the purpose of the procedure linkage table?过程链接表的目的是什么?
【发布时间】:2013-12-27 12:01:20
【问题描述】:

我很好奇为什么存在过程链接表。它的用途是什么?程序集不能直接调用全局偏移表吗?调用 PLT 比调用 Global Offset Table 有什么优势?

整个过程对我来说仍然有点困惑,我正试图弄清楚动态链接的进出,所以任何帮助都将不胜感激。

【问题讨论】:

标签: c linux binary x86


【解决方案1】:

对于从 PIC 代码进行的调用,您是正确的,PLT 并不是真正需要的。编译器可以很好地生成 GOT 查找并间接调用从 GOT 获得的地址。不过,使用 PLT 往往会使代码更高效(至少每次调用的体积膨胀较小),因此无论如何通常都会使用它。

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

【讨论】:

  • 太棒了!最后一个问题。如果没有 PLT,GOT 必须在 PIC 代码中做些什么不同的事情?更具体地说……为什么会更臃肿?
  • 只要通过 PLT,来自 PIC 代码的调用通常看起来与来自非 PIC 代码的调用相同,即单个 PC 相对调用指令。 (不过,可能还有其他要求,即 GOT 寄存器已经加载;这是特定于架构的。)通过 GOT 调用而不使用 PLT 与内联通常位于 PLT 条目中的代码相同,这通常是2-3条指令加载实际函数地址并跳转。
  • 好吧,我就是这么想的。我想在调用许多不同函数的情况下,体积会相当大,所以最好有两个不同的调用“层”以便更好地理解。谢谢你
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-11
  • 1970-01-01
  • 2021-10-22
  • 1970-01-01
  • 2010-11-08
  • 2013-10-13
  • 1970-01-01
相关资源
最近更新 更多