我一直在阅读有关重新定位和符号解析过程的内容,我也有一些问题。
所以整个进程(加载exec)都以exec(BA_OS)
命令开头。在exec(BA_OS)
期间,系统从PT_INTERP
段中检索路径名,并从解释器文件段中创建初始过程映像。也就是说,系统不是使用原始可执行文件的段图像,而是为解释器组成存储器图像。然后,解释器有责任从系统接收控制并为应用程序提供环境。
之后,动态链接器执行以下操作(只要LD_BIND_NOW
具有非空值):
exec(BA_OS)
获得控制权。所以,我现在的问题是
1。这些共享对象何时加载到内存中?
上面的第二步指出链接器将共享对象内存段添加到过程映像。是否所有(并且我的意思是共享对象及其依赖关系和它们的依赖关系等)此时加载了库?或者链接器仅使用依赖项创建进程映像,并在以后需要时将库加载到物理内存中?
2。动态链接器如何获取地址以修补符号的GOT
条目?
下面是第一次调用函数时发生的事情(或者我知道会发生什么)。
PLT
条目。GOT
条目。Elf_Rel
结构。link_map
结构(在另一篇文章中这是指向Relocation表的指针),以便链接器能够
找到符号所属的库。动态链接器在调用时会执行什么操作?它如何使用堆栈上的项目(偏移量和指针)来修补GOT条目? 假设有大量的.so文件,那么动态链接器是否有任何顺序搜索这些文件?
我刚开始学习这些东西。如果我的理解不正确,请纠正我。如果您知道其他任何好资源,请告诉我。