我最近进入了gcc的内联汇编并具备基本的汇编知识,在我尝试使用一个或多个参数进行简单的sys_execve之前,我理解了如何使系统调用很好。 如果我没有传递任何其他参数,系统调用execve工作正常,并且在尝试传递任何参数时只运行不带参数的可执行文件。
#include <stdio.h>
char *argv[]={"/bin/echo","parameter test", NULL};
int main(){
__asm__ volatile ("int $0x80"
:
:"a"(11), // syscall number (execve)
"b"(argv[0]), // filename
"c"(argv), // arguments
"d"(0)); // env
return 0;
}
我不知道会出现什么问题,因为我已经用
进行了测试execve(argv[0], argv, NULL);
它按预期工作。
答案 0 :(得分:4)
这是32位代码,使用32位约定。使用gcc -m32
进行编译,它将起作用。或者,切换到正确的64位版本,例如:
#include <stdio.h>
char *argv[]={"/bin/echo","parameter test", NULL};
int main(){
int ret;
__asm__ volatile ("syscall"
:"=a" (ret)
:"a"(59), // syscall number (execve)
"D"(argv[0]), // filename
"S"(argv), // arguments
"d"(0) // env
:"rcx","r11","cc");
return 0;
}
实际问题是你在数组中有64位指针,但你使用的32位兼容性中断当然需要32位的poiters。