的最好方法知道如何做的是編寫一個例子,在停止裝配水平。讓我們借這個例子:
#include <unistd.h>
int
main()
{
char *program = "/bin/ls";
char *args[3] = {"/bin/ls", "-l", "./"};
execv(program, args);
return 0;
}
當gcc -Wall -Wextra -S -o myexec.s myexec.c
編譯就可以在myexec.s
閱讀:
.file "myexec.c"
.section .rodata
.LC0:
.string "/bin/ls"
.LC1:
.string "-l"
.LC2:
.string "./"
.text
.globl main
.type main, @function
main:
.LFB0:
pushq %rbp
movq %rsp, %rbp
subq $32, %rsp
movq $.LC0, -8(%rbp)
movq $.LC0, -32(%rbp)
movq $.LC1, -24(%rbp)
movq $.LC2, -16(%rbp)
leaq -32(%rbp), %rdx
movq -8(%rbp), %rax
movq %rdx, %rsi
movq %rax, %rdi
call execv
movl $0, %eax
leave
ret
所以,命令行參數的清單由字符串列表中,並且在第一參數是可執行文件(-8(rbp)
)的路徑,然後通過指向其字符串的指針傳遞每個參數:argv[0] = -16(%rbp)
,argv[1] = -24(%rbp)
,argv[2] = -32(%rbp)
,...依此類推。
因此,您只需要將每個字符串的地址堆疊起來(以正確順序),然後調用execv
即可將其堆疊到堆棧上。
謝謝隊友。這有助於爲我清理一些事情。我對64位不熟悉,但每個arg作爲指向它的字符串的指針的概念是我不確定的(我猜每個NULL都終止了)。我會再去一次,我想我會發現重定向是否有效。 – user2296580
那麼我重新寫它,並得到它執行,因爲它應該但重定向不能按預期出於某種原因工作。我得到-i:>&:沒有這樣的文件或目錄。 – user2296580