4

这几天我一直在想办法解决这个问题。显然,我太缺乏经验,无法从各种示例中理解实际代码,无论我多么努力,我都找不到足够简单的解释来理解。这真的不是我的一杯茶。

我的问题是,我能否获得一个链接(或答案),其中包含一些非常易于理解的伪代码或如何执行以下操作的说明:

在 ac 程序中,将另一个 ELF 可执行文件加载到内存中,设置内存和堆栈以及所有其他必要的变量,然后执行它。

我了解基本概念,但对我来说并没有融合在一起。我检查了许多其他来源,包括 StackOverflow 上的这里,它们都太复杂了,我的白痴大脑无法理解。

谢谢你。

4

2 回答 2

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 内核源代码。

于 2013-10-30T04:40:27.647 回答
0

在 ac 程序中,将另一个 ELF 可执行文件加载到内存中,设置内存和堆栈以及所有其他必要的变量,然后执行它。

您不能在 C 程序中真正做到这一点,因为 C 程序已经加载到内存中(从它自己的 ELF 映像)并正在运行。这两个 ELF 映像会相互冲突,因此当您尝试映射新映像时,您将在中途搞砸旧(正在运行的)映像,事情将无法正常工作。

内核在执行映像时所做的第一件事是清除(清空)用户地址空间,因此可以加载新映像而不会发生任何冲突。

话虽如此,您可以(使用仔细的链接脚本)安排构建两个没有冲突的 ELF 映像,以便第一个可以加载第二个并且两者可以同时存在于内存中。这本质上就是 ld.so(动态链接器)的工作方式——它链接在特殊地址,因此它可以与“正常”程序共存。但是任何两个“正常”的 ELF 可执行文件都希望生活在同一个地址

于 2013-10-30T05:00:21.943 回答