ELF 文件装载执行
参考资料:
静态库加载(Static Lib Load)
这里说的静态库加载指的是程序链接到静态库生成的exe文件的加载,静态库的加载相对动态库要简单很多,因为全部工作已经由编译器的链接器ld给我们完成了,我们要做的只是把ELF文件map到相应运行地址空间,然后把PC指向entry即可。
- 数据映射(Data Map):可以理解为copy,因为每一个 elf 都具有相同运行的地址空间,这个可以通过链接脚本指定,上面的 elf 的运行地址空间从
0x80000000
开始,很明显这个地址是个虚拟地址,也就是说,我们要把 elf 文件映射到这个地址空间上去; - 究竟拷贝哪些内容呢?我们之前的 segment 现在可以出马了,segment 里记录了我们需要拷贝的内容的全部信息。在静态库加载中,我们直接把属性为 RWE 的 LOAD 段拷贝到
0x80000000
,即可,需要注意的是,需要手动把.bss
清0; - 将PC指向之前解析的 elf header 中的
e_entry
。
注意:在多个ELF加载的过程中,需要把相同运行地址空间映射到不同的物理地址空间,这样才能保证每个ELF的代码和数据是相互独立的。(这个概念和多进程有点类似,此处不多讲,这涉及到地址空间管理的问题)