我正在做一个项目来学习如何在Linux中执行程序。基本上,我试图通过在c程序中运行一系列系统调用来复制execve的功能,以获取可执行二进制文件,将其加载到内存中,并成功运行它。
我是否可以使用相对易于理解的在线资源(或提示)来学习如何执行此操作?我对此没有多少经验,我正在努力学习。这似乎是一项相当复杂的任务,而且我现在完全陷入困境。
谢谢。
答案 0 :(得分:2)
这里的主要问题是exec
系统调用的一部分正在覆盖内核中的进程描述符。这是你在用户空间无法做到的事情。
即使您关闭所有文件描述符,仍然有许多其他值无法访问,也无法释放动态加载的库并释放您自己的程序代码页(因为它们将被写保护)。
加载和运行代码文件的基本方法是将mmap
放入内存,然后清除堆栈,解析ELF头并跳转到程序启动函数(assembly jmp
指令,请注意)但是ELF文件还有很多,所以如果没有其他初始化和动态链接,它可能无法工作......