函数execve的实现(unistd.h)

时间:2011-09-11 22:08:55

标签: linux assembly system-calls unistd.h execve

我怎样才能看到函数execve的实现(在x86_64 Linux下),它在库中是unistd吗? 我想要这个,因为我想知道如何使用汇编程序调用外部程序,而不需要调用execve。 我知道有一个名为execve的系统调用,但我不知道如何使用它。

如何将char *类型的变量和char * []类型放入寄存器?

3 个答案:

答案 0 :(得分:1)

用户空间中execve()函数的实现类似于:

int execve(const char *filename, char * const argv[], char * const envp[]) {
    return syscall(SYS_execve, filename, argv, envp);
}

所有实际的“工作”都在内核中完成。在libc中没有什么特别有趣的事情发生,除了一些线程清理之外。

答案 1 :(得分:1)

只需查看内核源代码(更具体地说:arch / YOUR-ARCH / kernel / head * .S),了解架构上的系统调用约定(寄存器和/或堆栈中的系统调用号和参数)

例如,在ARM上,您可以将__NR_execve加载到r7中,将参数加载到r0,r1,r2中,然后使用swi 0。您可能会对this explantion of ARM EABI syscalls感兴趣了解更多详情。

答案 2 :(得分:0)

源代码中没有真正直接实现系统调用glibc - 这是在构建时从定义系统调用号的各种文件生成的。

如果您了解相关信息,可以在sysdep.h中找到相关信息,但实际的系统电话号码除外(您希望__NR_execve使用,IIRC,#include <asm/unistd.h> - 我无法回忆随便在x86_64上它是什么。

系统调用号码以%rax为单位,参数位于%rdi%rsi%rdx中。所有这些信息(包括堆栈对齐和内核的寄存器使用情况)都在sysdep.h中进行了注释。