我一直在阅读有关重定位和符号解析过程的内容,并且对此有一些疑问。
所以整个过程(加载执行程序)开始于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
结构(在另一篇文章中,这是一个指向重定位表的指针),以便链接器
查找该符号属于哪个库。
- 调用动态链接器。
- 修补 GOT 条目。
动态链接器被调用时会做什么?它如何使用堆栈上的项目(偏移量和指针)来修补 GOT 条目?
假设有大量.so文件,那么动态链接器搜索这些文件有什么顺序吗?
我刚刚开始学习这些东西。如果我的理解不正确,请纠正我。如果您知道任何其他好的资源,请告诉我。
None
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)