¿Dónde están ubicadas las syscalls en fuente glibc?
glibc ubuntu (4)
El código de llamada al sistema real para chdir()
se genera automáticamente en la mayoría de los sistemas compatibles con glibc
, mediante el script make-syscalls.sh
. Por eso no puedes encontrarlo en el árbol fuente.
Así que estaba mirando a través de la fuente linux glibc y no veo dónde realmente hace nada. Lo siguiente es de io/chdir.c
pero es indicativo de muchos de los archivos de origen. ¿Que está pasando aqui? Obviamente me falta algo. ¿Cuál es el secreto, dónde hace una llamada al sistema o realmente hace algo?
stub_warning
es una locura heredada. __set_errno
parece ser una macro simple que establece errno
. Y mientras encuentro un millón de usos de weak_alias
, no lo veo definido en ninguna parte.
¿Existe una guía útil para comprender cómo funciona glibc en algún lugar?
#include <errno.h>
#include <stddef.h>
#include <unistd.h>
/* Change the current directory to PATH. */
int
__chdir (path)
const char *path;
{
if (path == NULL)
{
__set_errno (EINVAL);
return -1;
}
__set_errno (ENOSYS);
return -1;
}
stub_warning (chdir)
weak_alias (__chdir, chdir)
#include <stub-tag.h>
Eso es un código auxiliar genérico que se usa si no existe otra definición; weak_alias
es una macro cpp
que le dice al vinculador que __chdir
debe usarse cuando se solicita chdir
, pero solo si no se encuentra ninguna otra definición. (Vea los symbols weak para más detalles.)
chdir
es en realidad una llamada al sistema; habrá enlaces de llamadas del sistema por sistema operativo en el árbol de fuentes de gibc
, que gibc
la gibc
código auxiliar con una real que llama al núcleo. Esto le permite a glibc
presentar una interfaz estable a través de sistemas que pueden no tener todas las llamadas de sistema que glibc
conoce.
Lo que has encontrado es una función de código auxiliar para sistemas en los que no se implementa. sysdeps
buscar en la implementación real bajo el árbol de sysdeps
. Lo siguiente puede ser de interés:
-
sysdeps/unix/sysv/linux
-
sysdeps/posix
-
sysdeps/i386
(ox86_64
o lo que sea su cpu arch)
Tenga en cuenta que las llamadas reales del sistema no están definidas en ninguna parte del árbol de origen, se generan en tiempo de syscalls.list desde syscalls.list (el syscalls.list está en sysdeps / unix, hay otros adicionales más abajo), una serie de macros en sysdep.h (linux vinculado / i386), y un script que realmente genera los archivos de origen.