ELF 文件装载执行

参考资料:

  1. ELF加载器的原理与实现_elf loader

静态库加载(Static Lib Load)

这里说的静态库加载指的是程序链接到静态库生成的exe文件的加载,静态库的加载相对动态库要简单很多,因为全部工作已经由编译器的链接器ld给我们完成了,我们要做的只是把ELF文件map到相应运行地址空间,然后把PC指向entry即可。

  1. 数据映射(Data Map):可以理解为copy,因为每一个 elf 都具有相同运行的地址空间,这个可以通过链接脚本指定,上面的 elf 的运行地址空间从 0x80000000 开始,很明显这个地址是个虚拟地址,也就是说,我们要把 elf 文件映射到这个地址空间上去;
  2. 究竟拷贝哪些内容呢?我们之前的 segment 现在可以出马了,segment 里记录了我们需要拷贝的内容的全部信息。在静态库加载中,我们直接把属性为 RWE 的 LOAD 段拷贝到0x80000000,即可,需要注意的是,需要手动把 .bss 清0;
  3. 将PC指向之前解析的 elf header 中的 e_entry

注意:在多个ELF加载的过程中,需要把相同运行地址空间映射到不同的物理地址空间,这样才能保证每个ELF的代码和数据是相互独立的。(这个概念和多进程有点类似,此处不多讲,这涉及到地址空间管理的问题)

动态库加载(Dynamic Lib Load)