我一直在努力解决这个问题。显然,我太缺乏经验,无法理解各种例子中的实际代码,无论我怎么努力,我都找不到足够简单的解释。这真的不是我的一杯茶。
我的问题是,我是否可以获得一个链接(或答案),其中包含一些非常容易理解的伪代码或如何执行以下操作的说明:
在c程序中,将另一个ELF可执行文件加载到内存中,设置内存和堆栈以及所有其他必要的变量,然后执行它。
我理解基本概念,但它并不是为了我而聚集在一起。我已经检查了许多其他来源,包括StackOverflow上的内容,而且它们太复杂了,我的白痴大脑无法理解。
谢谢。
答案 0 :(得分:0)
在Linux x86上,execve是系统调用号11,可以使用以下命令调用:
long execve(const char *filename, char *const argv[], char *const envp[]){
long r;
asm volatile("int $128" : "=a"(r):"a"(11),"b"(filename),"c"(argv),"d"(envp):"memory");
return r;
}
大多数libc将如何实现它(更多间接通过错误处理等...)
要了解execve系统调用的工作原理,请查看linux内核源代码。
答案 1 :(得分:0)
在c程序中,将另一个ELF可执行文件加载到内存中,设置内存和堆栈以及所有其他必要的变量,然后执行它。
你不能在C程序中真正做到这一点,因为C程序已经加载到内存中(来自它自己的ELF图像)并且正在运行。这两个ELF图像会相互冲突,因此当您尝试映射新图像时,您将部分地处理旧的(正在运行的)图像并且事情将无法正常工作。
内核在执行图像时所做的第一件事是它清除(清空)用户地址空间,因此可以加载新图像而不会发生任何冲突。
现在说,你可以(通过仔细的链接脚本)安排构建两个没有冲突的ELF图像,这样第一个可以加载第二个,并且两者都可以同时存在于内存中。这基本上是ld.so(动态链接器)工作的方式 - 它在特殊地址链接,因此它可以与'普通'程序共存。但任何两个“正常”的ELF可执行文件都希望生活在相同的地址