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