gpt4 book ai didi

c - Linux 裸系统调用,而不是 glibc

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:43:34 27 4
gpt4 key购买 nike

我正在阅读一篇解释如何在不通过 glibc 的情况下调用裸系统调用的文章。要调用 chmodexit,请使用:

#include <linux/unistd.h>
_syscall2(int,chmod,char*,f,int,m)
_syscall1(int,exit,int,r)

我的 gcc 提示他们。它们的用途是什么,它们是如何工作的?

$ gcc --version
gcc (Ubuntu 7.4.0-1ubuntu1~18.04) 7.4.0
$ gcc e.c
e.c:2:15: error: unknown type name ‘setresuid’; did you mean ‘__NR_setresuid’?
_syscall3(int,setresuid,int,r,int,e,int,s)
^~~~~~~~~
__NR_setresuid
e.c:2:29: error: unknown type name ‘r’
_syscall3(int,setresuid,int,r,int,e,int,s)
^
e.c:2:35: error: unknown type name ‘e’
_syscall3(int,setresuid,int,r,int,e,int,s)
^
e.c:2:41: error: unknown type name ‘s’
_syscall3(int,setresuid,int,r,int,e,int,s)
^

最佳答案

您的文章可能已过时。

如果您使用 C 编写代码,则没有理由避免使用 syscalls(2) (注意复数)如文件所示。还要注意 vdso(7) .您可以使用其他一些 C standard libraryglibc(例如 musl-libcdietlibc 等...)您可能(但不推荐)静态链接它。

您可能会使用 syscall(2) (注意单数)代替。我认为没有理由这样做,例如使用 read(2)mmap(2)没有系统调用

Assembly HowTo可能是一本有趣的读物(注意,它可能过于以 32 位为中心,当今大多数 Linux PC 都是 64 位 x86-64)。

另见 osdev.org

顺便说一句,一些旧的 Unixes(例如 Solaris)有一个 libsys 提供 just 系统调用,并且它们的 libc 链接到它。我也想要一个 libsys!但在当前的 Linux 系统上,这并不重要,因为几乎每个进程(运行一些 dynamically linked ELF 可执行文件)都是 mmap(2) -ing,在ld-linux.so(8)之后,您的 libc.so.6 的几个段和部分;有关详细信息,请阅读 Drepper 的 How to write a shared library (因为它还详细解释了共享库的实际工作原理)。也可以使用 pmap(1)在某些正在运行 的进程上(例如 shell 中的 pmap $$)。

glibc 不知道一些罕见的系统调用(例如 userfaultfd(2) 今天 2Q2019)。他们是个异常(exception),因为大多数 system calls由您的 libc 包装(包装通常只处理失败时的 errno(3) 设置)。注意 strace(1) .

你还应该阅读 Operating Systems: Three Easy Pieces (这是一本可免费下载的书,解释了系统调用的作用和原因)

关于c - Linux 裸系统调用,而不是 glibc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56414083/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com