假设我有一个名为P
的程序,该程序与库动态链接。当调用一个用-fPIC
编译的共享库中的函数时,我理解这些事情会发生
call functionName@plt
P
的内容
PLT
表代码到相应的条目GOT
入口点GOT
条目将指向我们返回绑定代码的PLT
条目GOT
条目并运行它 GOT
条目存储一个地址,如果该函数尚未被调用,则该地址对应于相应PLT
条目中的绑定代码,或者它指向functionName
代码地址。我的问题是为什么在步骤1中的呼叫点处的P不存在类似call [functionName@GOT]
的东西。
意味着加载GOT
条目的值并直接跳转到那里。除了第一个函数之外,这将为每个函数调用提供一个更少的间接。如果是第一次调用,它将跳转到PLT
绑定代码,绑定将发生,GOT
的值将更新。后续调用将直接指向函数代码,因为现在GOT
条目指向函数。
有一种怀疑是因为能够获取该功能的地址。是不是?
答案 0 :(得分:0)
如果是第一次调用,它将跳转到PLT绑定代码,绑定将发生,GOT的值将被更新。
PLT绑定代码如何知道要查找的函数?
第一次调用时,PLT存根sets up parameters to the resolver和每个 PLT存根的这些参数不同(这就是为每个导入函数需要一个PLT存根的原因)。