执行内联汇编

时间:2016-03-27 02:27:54

标签: linux gcc x86-64 system-calls inline-assembly

我最近进入了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);

它按预期工作。

1 个答案:

答案 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。