为什么后续的动态链接函数调用需要通过PLT进行额外的间接寻址?
问题描述:
可以说我有一个名为P
的程序,它与库动态链接。当调用一个函数,它是在与-fPIC
我了解这些事情发生编译共享库为什么后续的动态链接函数调用需要通过PLT进行额外的间接寻址?
- 有类似
call [email protected]
在P
- 这则跳转到
PLT
表的代码,以适当的条目 - 从那里,我们跳转到相应的
GOT
切入点 - 如果这是这个函数的第一个电话,那么这是当组合开始发生的瞬间和
GOT
条目将指引我们回到在绑定代码 -
PLT
条目所以绑定代码然后查找函数的地址,并把该地址值到GOT
条目并运行它
的GOT
中存储了地址,其要么是到结合如果函数还没有被调用或者它指向functionName
代码地址,则在相应的PLT
条目中的代码。我的问题是为什么在步骤1的呼叫点P不存在像call [[email protected]]
这样的东西。
含义是加载GOT
条目的值并直接跳到那里。除了第一个函数以外,这个函数对于每个函数的调用都会减少间接性。如果它是第一个呼叫,它将跳转到PLT
绑定代码,绑定将发生并且GOT
的值将被更新。随后的呼叫将直接指向功能代码,因为现在GOT
条目指向该功能。
一个怀疑是因为能够接受函数的地址。这样对吗?
答
如果是第一个调用它将跳转到PLT绑定代码,绑定将会发生并且GOT的值将被更新。
PLT绑定代码如何知道要查找哪个函数?
在第一次通话中,PLT存根sets up parameters to the resolver,而这些参数对于每个 PLT存根不同(这就是为什么你需要为每个导入函数一个PLT存根)。
你的意思是文章中的“准备参数”解析器“例程”的部分?如果是,那么不是GOT条目最初指向的地址,这个准备代码的第一条指令又依次设置参数? – user183833