c - 实现我自己的系统调用

标签 c system glibc libc low-level

跟进 this问题。我正在编写自己的(非常基本的)标准库(使用 -nostdlib gcc 选项编译)。似乎几乎所有事情的基础都是writereadcreatopenclose

据我了解,glibc 只是使用 stub 、SYSCALL_INTERNAL 宏等来提供这些功能。我没有使用 glibc,我不想变得非常复杂。

我的问题。如何在没有 glibc 的情况下调用 Unix 低级函数,例如 writeread

最佳答案

您可以直接从汇编语言进行系统调用,例如,对于 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/

相关文章:

C - 想要使用符号转换大小写字母

c++ - Open GL 在 Codelite Windows 7 上编译,但没有显示输出

c - 通过杀死其父进程而成为孤儿的子进程不会被 init 收养。我该如何解决?

r - 为什么加载 mysql 在命令行中有效,但在 R 中使用 system() 则无效?

malloc - glibc 中 _int_malloc( ) 中的扰动字节

c - 在读取内存时递增变量

c++ - tcmalloc 的碎片

c - 在 Pro*C 中处理 float

java - 将 C 源代码转换为 Java 源代码?最好是 window

ruby-on-rails - 如何在 Rails 中捕获 ffmpeg 输出?