实现我自己的系统调用

时间:2017-03-07 02:17:52

标签: c system glibc libc low-level

this问题的后续行动。我正在编写自己的(非常基本的)标准库(使用-nostdlib gcc选项进行编译)。几乎所有内容的基础似乎都是writereadcreatopenclose等。

我的理解是glibc只使用存根,SYSCALL_INTERNAL宏等来提供这些功能。我没有使用glibc而且我不想变得非常复杂。

我的问题。如何在没有glibc的情况下调用{* 1}}和write等Unix低级函数?

1 个答案:

答案 0 :(得分:2)

您可以直接从汇编语言进行系统调用,例如,对于Linux x86_64:

main.c

long mywrite(int, const void *, unsigned long);

int main(void)
{
    char buffer[] = "Hello, world!\n";
    mywrite(1, buffer, 14);
    return 0;
}

write.S

.global mywrite

.text

mywrite:
        push    %rbp
        mov     %rsp, %rbp
        mov     $1, %rax
        syscall
        leave
        ret

带输出:

paul@thoth:~/src/sandbox/syscall$ gcc -o sc main.c write.S
paul@thoth:~/src/sandbox/syscall$ ./sc
Hello, world!
paul@thoth:~/src/sandbox/syscall$ 

显然,这个实现并没有设置errno或类似的东西,但这与实际进行系统调用无关。在程序集中实现单个syscall()函数会更容易,然后使用常规的C函数来调用它。