跟进this问题。我正在编写自己的(非常基本的)标准库(使用-nostdlibgcc选项编译)。似乎几乎所有事物的基础都是writereadcreatopencloseSYSCALL_INTERNAL等。
据我所知,glibc只是使用stub、write宏等来提供这些函数。我没有用glibc,我不想变得很复杂。
我的问题。如果没有glibc,我如何调用Unix低级函数,如read和?

最佳答案

您可以直接从汇编语言进行系统调用,例如,对于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函数调用它会更容易。

关于c - 实现我自己的系统调用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42638986/

10-15 01:29
查看更多