如何嵌入内联汇编来调用sys_unlink?

时间:2011-01-01 02:09:38

标签: c assembly inline-assembly system-calls unlink

我尝试使用内联汇编调用sys_unlink,如下所示:

 int sys_unlink(const char *filename) {

    int ret;

    __asm__("int $0x80" : "=a"(ret) : "a"(10), "b"(filename));

    return ret;

}

但它不起作用,它总是返回-14。

我想知道这段代码是否正确,因为我不太了解装配。

2 个答案:

答案 0 :(得分:3)

该代码仅适用于x86(32位)进程 - 它不会为x86-64进程使用正确的系统调用号。使用__NR_unlink中的asm/unistd.h代替硬编码的10

#include <asm/unistd.h>

int sys_unlink(const char *filename)
{
    int ret;

    asm("int $0x80" : "=a"(ret) : "a"(__NR_unlink), "b"(filename));
    return ret;
}

如果 编译32位进程,则-14EFAULT,表示您传递的文件名存在问题。你怎么称呼它?

答案 1 :(得分:3)

我认为你不能将这项工作限制在Linux下的单一平台上:Linux制作系统调用的现代方法是通过内核提供的存根并通过VDSO链接。即使你链接的libc也不知道(不需要需要知道)系统调用约定是什么 - 它只是从VDSO引入一个引用。它通过一个隐藏在environ之后隐藏的魔术参数来引用VDSO,然后将其视为任何其他动态库。内核根据CPU功能选择系统调用约定。

我碰巧知道(因为我试图这样做!),很难获得这些VDSO符号。 glibc不会为你导出它们(或任何有用的句柄)。关于我看到的唯一可行的方法是检查你自己的/proc/self/maps以找到VDSO,然后使用dl函数来获取它(重复一些glibc设置工作)。