的最好方法知道如何做的是编写一个例子,在停止装配水平。让我们借这个例子:
#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