执行内联汇编

Execve inline assembly

我最近接触了 gcc 的内联汇编并掌握了基本的汇编知识,在尝试使用一个或多个参数进行简单的 sys_execve 之前,我了解如何很好地进行系统调用。 如果我没有向它传递任何附加参数,系统调用 execve 工作正常,并且在尝试传递任何参数时只运行不带参数的可执行文件。

#include <stdio.h>

char *argv[]={"/bin/echo","parameter test", NULL};

int main(){
  __asm__ volatile ("int [=10=]x80"
          :
          :"a"(11), // syscall number (execve)
           "b"(argv[0]), // filename
           "c"(argv), // arguments
           "d"(0)); // env
  return 0;
}

我不知道会出什么问题,因为我已经用

测试过了
execve(argv[0], argv, NULL);

它按预期工作。

这是 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 位指针。