符号解析和动态链接

时间:2018-05-21 16:45:00

标签: c elf dynamic-linking .so symbol-table

我一直在阅读有关重新定位和符号解析过程的内容,我也有一些问题。

所以整个进程(加载exec)都以exec(BA_OS)命令开头。在exec(BA_OS)期间,系统从PT_INTERP段中检索路径名,并从解释器文件段中创建初始过程映像。也就是说,系统不是使用原始可执行文件的段图像,而是为解释器组成存储器图像。然后,解释器有责任从系统接收控制并为应用程序提供环境。

之后,动态链接器执行以下操作(只要LD_BIND_NOW具有非空值):

  • 将可执行文件的内存段添加到过程映像;
  • 将共享对象内存段添加到过程映像;
  • 为可执行文件及其共享执行重定位 对象;
  • 关闭用于读取可执行文件的文件描述符 文件,如果有一个给动态链接器;
  • 将控制转移到程序,使其看起来像程序 已直接从exec(BA_OS)获得控制权。

所以,我现在的问题是

1。这些共享对象何时加载到内存中?

上面的第二步指出链接器将共享对象内存段添加到过程映像。是否所有(并且我的意思是共享对象及其依赖关系和它们的依赖关系等)此时加载了库?或者链接器仅使用依赖项创建进程映像,并在以后需要时将库加载到物理内存中?

2。动态链接器如何获取地址以修补符号的GOT条目?

下面是第一次调用函数时发生的事情(或者我知道会发生什么)。

  • 跳转到我们符号的PLT条目。
  • 跳转到我们符号的GOT条目。
  • 跳回PLT条目并在堆栈上推送偏移量。那 偏移实际上是一个描述如何修补符号的Elf_Rel结构。
  • 跳转到PLT存根条目。
  • 将指针推送到link_map结构(在另一篇文章中这是指向Relocation表的指针),以便链接器能够 找到符号所属的库。
  • 调用动态链接器。
  • 修补GOT条目。

动态链接器在调用时会执行什么操作?它如何使用堆栈上的项目(偏移量和指针)来修补GOT条目? 假设有大量的.so文件,那么动态链接器是否有任何顺序搜索这些文件?

我刚开始学习这些东西。如果我的理解不正确,请纠正我。如果您知道其他任何好资源,请告诉我。

0 个答案:

没有答案