假设二进制文件是PIC,如何将其加载到内存中并执行入口点?
我这样做是为了熟悉ELF,因此不允许使用execve
。
答案 0 :(得分:6)
这些是基本步骤:
mmap
为您指定一个地址。这将保留连续的虚拟地址空间。MAP_FIXED
将提醒LOAD指令映射到此映射的部分顶部。DYNAMIC
向量,该向量将为您提供重定位向量的地址。RELATIVE
重定位组成(只需添加基本加载地址),这意味着你不必执行任何符号查找或任何花哨的东西。构造一个ELF程序入口堆栈,该堆栈由堆栈中数组中的以下系统字大小值序列组成:
ARGC ARGV[0] ARGV[1] ... ARGV[ARGC-1] 0 ENVIRON[0] ENVIRON[1] ... ENVIRON[N] 0 0
(此步骤需要ASM!)将堆栈指针指向此数组的开头并跳转到加载程序的入口点地址(可在程序头中找到)。