无法执行系统调用" execve"

时间:2014-04-29 22:50:32

标签: 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));
//"a" (11) ... 11 correspondes to execve

我用

编译代码(既没有错误也没有警告)
gcc -m32 -nostdlib -nostdinc -static -O2 sysc.c -o sysc

当我尝试运行程序时,我看到了这条消息:

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

2 个答案:

答案 0 :(得分:1)

如果查看生成的代码,您会看到编译器优化了argvenvp的初始化,假设您的asm块没有访问它们(因为你只声明自己需要指针。)

解决方案:添加"memory" clobber告诉编译器您可以读取或写入任何内存。

答案 1 :(得分:0)

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

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

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

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