我正在尝试编写一个基本的用户空间 ELF 加载器,它应该能够加载静态链接(非动态链接)的不可重定位二进制文件(即不是用 -pie、-fPIE 等构建的)。它现在应该可以在 x86 CPU 上运行。
我已经按照在用户空间中将 ELF 文件加载到 C 中的代码进行了操作,并且当可执行文件可重定位时它运行良好,但如果不是因为程序加载到错误的虚拟内存范围并立即崩溃,则正如预期的那样完全失败。
但是我尝试修改它以在它期望的虚拟偏移处加载程序(使用 phdr.p_vaddr)但我遇到了一个复杂的问题:我的加载器已经在使用那个虚拟内存范围!我不能映射它,更不用说往里面写任何东西了。如何继续,以便我可以将不可重定位的二进制文件加载到加载程序的地址空间中,而不会在加载程序完成之前覆盖它自己的代码?我是否需要让我的加载程序从完全不同的虚拟内存范围运行,也许是通过让链接器将其链接到高于不可重定位二进制文件的通常虚拟内存范围(在我的情况下恰好从 0x400000 开始)或有什么诀窍吗?
我已经阅读了 ELF 文档(顺便说一下,我在这里使用的是 ELF64,但我认为 ELF32 和 ELF64 非常相似)以及网络上的很多文档,但我仍然不明白。
有人能解释一下 ELF 加载器如何处理这种特殊的并发症吗?谢谢!