我正在使用 C++ 为 Linux 平台开发进程加载器;这只是一个娱乐项目。基本上,我想手动将可执行文件的所有部分加载到内存中,然后执行它。
我问了一个相关但更具体的问题 here大约一周前。然而,在阅读更多内容之后,我意识到在我学会如何实际创建进程之前,内存映射是无关紧要的。所以我的问题是,有没有办法在 Linux 上创建一个具有自己的虚拟地址空间(我将能够访问以加载代码和数据)的“空白”新进程?
即使是关于进程加载器开发的一般资源也会很有用,因为我还没有找到任何资源。
最佳答案
如果您有兴趣了解当您要求 Linux 进程加载器执行 exec()
操作时,Linux 进程加载器在幕后真正做了什么,请获取内核源代码的拷贝并查看 fs/exec.c
用于 do_execve_common()
。
ELF 处理程序本身位于 fs/binfmt_elf.c
中,如果您尝试运行 ELF 二进制文件,它最终会被调用。特别是,load_elf_binary()
执行实际加载,给定 struct linux_binprm
包含从磁盘加载过程镜像的必要信息。
观察Linux支持的二进制格式有很多binfmt_*.c
文件;如果您有自定义二进制格式,那么您原则上可以编写自己的二进制格式并将其作为内核模块提供。进程加载的内部结构对于用户模式代码是不透明的(这是理所当然的:如果不这样做,将存在严重的安全漏洞)。
关于c++ - C++ 中的 Linux 进程加载器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11871040/