【发布时间】:2017-07-27 15:24:58
【问题描述】:
我正在研究如何在动态链接中使用 GOT 和 PLT。我很困惑为什么每个动态链接的函数调用似乎都会跳转到 PLT 中的某个位置,而该位置总是会跳转到 GOT 中的相同位置。为什么不直接跳到 GOT 中的那个位置呢?为什么需要另一层间接?
我可能从根本上对 GOT 和 PLT 有一些误解,所以这里简要描述一下我对如何使用 PLT 和 GOT 的概念理解。
我们有一个名为 FunctionX 的函数,在 PLT 中的对应位置为 PLT[X],在 GOT 中的对应位置为 GOT[X]。 PLT 和 GOT 的地址在编译时是已知的,但 FunctionX 的地址是未知的。
为了调用FunctionX:
1) 调用(在汇编意义上)PLT[X] 的地址。
2) PLT[X] 是跳转到 GOT[X] 所包含的值。
3a) 如果 FunctionX 已经解析,则 GOT[X] 包含函数地址,因此第 2 步是跳转到 FunctionX。
3b) 否则,GOT[X] 包含将在运行时解析 FunctionX 地址的代码地址,将该地址写入 GOT[X],然后跳转到 FunctionX。在这种情况下,第 2 步会导致 FunctionX 被解析然后跳转到。
第一步的目的是什么?
我对这个话题的理解是粗略的,所以请指出任何可以帮助这个问题的澄清。
【问题讨论】:
-
这里只是猜测,但也许PLT是一个标准化的东西,但它恰好使用GOT的事实只是一个偶然的实现细节。
-
请参阅stackoverflow.com/questions/43048932/…,了解为什么在 x86 目标上无法轻松消除 PLT。
-
@RossRidge 这回答了我的问题。谢谢。
标签: assembly linker dynamic-linking plt got