[英]Implementation of function execve (unistd.h)
我怎樣才能看到函數execve的實現(在x86_64 Linux下),它在庫中是unistd嗎? 我想要這個,因為我想知道如何使用匯編程序調用外部程序,而不需要調用execve。 我知道有一個名為execve的系統調用,但我不知道如何使用它。
如何將char *類型的變量和char * []類型放入寄存器?
在用戶空間中執行execve()
函數看起來像:
int execve(const char *filename, char * const argv[], char * const envp[]) {
return syscall(SYS_execve, filename, argv, envp);
}
所有實際的“工作”都在內核中完成。 在libc中沒有什么特別有趣的事情發生,除了一些線程清理之外。
只需查看內核源代碼(更具體地說:arch / YOUR-ARCH / kernel / head * .S),了解架構上的系統調用約定(寄存器和/或堆棧中的系統調用號和參數)。
例如,在ARM上,您可以將__NR_execve
加載到r7中,將參數加載到r0,r1,r2中,然后使用swi 0
。 您可能對ARM EABI系統調用的這種解釋感興趣了解更多詳細信息。
源代碼中沒有真正簡單的系統調用實現到glibc - 這是在構建時從定義系統調用號的各種文件生成的。
如果您了解相關信息,可以在sysdep.h中找到,除了實際的系統調用號碼(您希望__NR_execve
with,IIRC, #include <asm/unistd.h>
- 我無法回想起它是什么x86_64的)。
系統調用號在%rax中,參數在%rdi%rsi%rdx中。 所有這些信息(包括堆棧對齊和內核的寄存器使用情況)都在sysdep.h中進行了注釋。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.