Linux голые системные вызовы, а не glibc - PullRequest
1 голос
/ 02 июня 2019

Я читаю статью, которая объясняет, как вызывать голые системные вызовы, не проходя через glibc.Чтобы позвонить chmod и exit, используйте:

#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)
                                         ^

1 Ответ

3 голосов
/ 02 июня 2019

Ваша статья, вероятно, устарела.

Если вы кодируете на C, нет причин избегать использования syscalls (2) (обратите внимание на множественное число), как описано в документации.Знайте также о vdso (7) .Вы можете использовать другую C стандартную библиотеку , отличную от glibc (например, musl-libc , dietlibc и т. Д.), И вы можете (но этоне рекомендуется) статически связывать его.

Вместо этого вы можете использовать syscall (2) (обратите внимание на единственное число).Я не вижу причин для этого, например, используйте read (2) или mmap (2) без syscall.

Assembly HowTo может быть интересным чтением (будьте осторожны, оно может быть слишком 32-битным, большинство компьютеров с Linux сегодня 64-битные x86-64).

См. также osdev.org

Кстати, некоторые старые Unix (например, Solaris) имели libsys, обеспечивающий только системных вызовов, и их libc были связаны с ним.Я бы тоже хотел libsys!Но в современных системах Linux это не имеет особого значения, так как почти каждый процесс (выполняющий некоторые динамически связанные ELF исполняемые файлы) mmap (2) -ing,после ld-linux.so (8) , несколько сегментов и разделов вашего libc.so.6;Подробнее читайте в Drepper Как написать разделяемую библиотеку (поскольку в ней также подробно объясняется, как на самом деле работают разделяемые библиотеки).Также используйте pmap (1) в некоторых запущенных процессах (например, pmap $$ в оболочке).

Некоторые редкие системные вызовы (например, userfaultfd (2) сегодня 2Q2019) не известны glibc.Они являются исключением, потому что большинство системных вызовов упакованы вашим libc (оболочка обычно имеет дело только с установкой errno (3) при сбое).Помните о strace (1) .

И вы также должны прочитать Операционные системы: Три простых пьесы (это свободно загружаемая книга, объясняя роль и причину системных вызовов)

...