首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >execve函数的实现(unistd.h)

execve函数的实现(unistd.h)
EN

Stack Overflow用户
提问于 2011-09-12 06:08:55
回答 3查看 2K关注 0票数 1

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

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

EN

回答 3

Stack Overflow用户

发布于 2011-09-12 07:11:07

execve()函数在用户空间中的实现如下所示:

代码语言:javascript
复制
int execve(const char *filename, char * const argv[], char * const envp[]) {
    return syscall(SYS_execve, filename, argv, envp);
}

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

票数 2
EN

Stack Overflow用户

发布于 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感兴趣,以了解更多详细信息。

票数 2
EN

Stack Overflow用户

发布于 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中进行注释。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7381608

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档