Can';t执行系统调用";execve“;

Can';t执行系统调用";execve“;,c,arrays,assembly,execve,C,Arrays,Assembly,Execve,我是一个新手,所以我可以在表达上不准确。我需要用汇编语言在C中进行系统调用“execve”。我不使用任何图书馆。不起作用的部分是 char *nul=(char *)0; char *argv[] = { "/bin/date", nul }; char *envp[] = { nul }; long ret; asm volatile ("int $0x80" : "=a" (ret) : "a" (11), "b" (argv[0]), "c" (argv), "d" (envp)); //

我是一个新手,所以我可以在表达上不准确。我需要用汇编语言在C中进行系统调用“execve”。我不使用任何图书馆。不起作用的部分是

char *nul=(char *)0;
char *argv[] = { "/bin/date", nul };
char *envp[] = { nul };
long ret;
asm volatile ("int $0x80" : "=a" (ret) : "a" (11), "b" (argv[0]), "c" (argv), "d" (envp));
//"a" (11) ... 11 correspondes to execve
我使用

当我尝试运行程序时,我看到以下消息:

A NULL argv[0] was passed through an exec system call.
Aborted

如果查看生成的代码,您将看到编译器优化了
argv
envp
的初始化,前提是asm块没有访问它们(因为您只声明需要指针本身)


解决方案:添加一个
“内存”
clobber,告诉编译器您可以读取或写入任何内存。

函数族
exec()
的参数有点奇怪

特别是,arg0和arg1大致相同:

char *args [] = {"./path/to/program", "arg1", "arg2", NULL};

int rc = execve (args[0], args, envp);

您是否尝试通过ecx传递
&argv
?为什么需要使用汇编程序从C程序调用C函数?(我不是说没有可能的原因,但是知道你的目标可能有助于回答这个问题。)
c
也应该是
argv[0]
。在C语言中,指向数组的指针非常罕见,而且毫无用处;通常,您总是对指向第一个元素的指针进行操作。@ccKep我做了,没有帮助。@KerrekSB没有,也不起作用
char *args [] = {"./path/to/program", "arg1", "arg2", NULL};

int rc = execve (args[0], args, envp);