簡體   English   中英

函數execve的實現(unistd.h)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM