Подтвердить что ты не робот

Где находятся системные вызовы, расположенные в источнике glibc

Итак, я просматривал источник linux glibc, и я не вижу, где он на самом деле что-то делает. Ниже приведено значение io/chdir.c, но это указывает на многие исходные файлы. Что здесь происходит? Очевидно, что я что-то упускаю. Какой секрет, где он делает системный вызов или на самом деле что-то делает?

stub_warning - это какое-то унаследованное безумие. __set_errno кажется простым макросом, который устанавливает errno. И пока я нахожу миллион обычаев weak_alias, я не вижу, чтобы это было определено где-нибудь.

Есть ли полезное руководство для понимания того, как glibc работает где-то?

#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> 
4b9b3361

Ответ 1

То, что вы нашли, - это заглушка для систем, на которых она не реализована. Для фактической реализации вам нужно посмотреть дерево sysdeps. Может быть интересно следующее:

  • sysdeps/unix/sysv/linux
  • sysdeps/posix
  • sysdeps/i386 (или x86_64 или независимо от вашей арки процессора)

Ответ 2

Фактический код системного вызова для chdir() автоматически генерируется в большинстве систем, поддерживаемых glibc, script make-syscalls.sh. Вот почему вы не можете найти его в исходном дереве.

Ответ 3

Это общий патч, который используется, если другого определения не существует; weak_alias - это макрос cpp, который сообщает компоновщику, что __chdir следует использовать, когда запрашивается chdir, но только если не найдено никакого другого определения. (Подробнее см. weak symbols. )

chdir - фактически системный вызов; в дереве исходных текстов gibc будут привязки системных вызовов для каждой ОС, что переопределит определение заглушки реальным, которое вызывает ядро. Это позволяет glibc представить стабильный интерфейс в системах, которые могут не иметь всех системных вызовов, о которых glibc знает.

Ответ 4

Обратите внимание, что фактические системные вызовы не определены нигде в исходном дереве - они генерируются во время сборки из syscalls.list ( связанный с ним в sysdeps/unix, есть еще дополнительные), серия макросов в sysdep.h (связанный linux/i386), и a script, который фактически генерирует исходные файлы.