我怎样才能看到函数execve的实现(在x86_64 Linux下),它是在unistd库中的吗?我之所以想要这样,是因为我想知道如何使用汇编程序调用外部程序,而不调用execve。我知道有一个名为execve的syscall,但我不知道如何使用它。
如何将char *类型和char * []类型的变量放入寄存器?
发布于 2011-09-12 07:11:07
execve()函数在用户空间中的实现如下所示:
int execve(const char *filename, char * const argv[], char * const envp[]) {
return syscall(SYS_execve, filename, argv, envp);
}所有实际的“工作”都是在内核中完成的。除了一些线程清理之外,libc中并没有发生什么特别有趣的事情。
发布于 2011-09-12 15:39:40
只需查看内核源代码(更具体地说: arch/ your -ARCH/ kernel /head*.S),了解您的体系结构上的系统调用约定( syscall号和参数的寄存器和/或堆栈)。
例如,在ARM上,您可以将__NR_execve加载到r7中,将参数加载到r0、r1、r2中,然后使用swi 0。您可能会对this explantion of ARM EABI syscalls感兴趣,以了解更多详细信息。
发布于 2011-09-12 09:40:18
在glibc的源代码中没有真正直接的系统调用实现-这是在构建时从各种定义系统调用编号的文件中生成的。
如果你理解的话,可以在sysdep.h中找到相关信息,除了实际的系统调用编号(你想要__NR_execve with,IIRC,#include <asm/unistd.h> -我想不起来它在x86_64上是什么了)。
系统调用号放在%rax中,参数放在%rdi %rsi %rdx中。所有这些信息(包括堆栈对齐和内核使用寄存器的相关信息)都会在sysdep.h中进行注释。
https://stackoverflow.com/questions/7381608
复制相似问题