Где находятся системные вызовы в glibc source - PullRequest
21 голосов
/ 29 июня 2011

Итак, я просматривал исходный код 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> 

Ответы [ 4 ]

15 голосов
/ 29 июня 2011

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

  • sysdeps/unix/sysv/linux
  • sysdeps/posix
  • sysdeps/i386 (или x86_64 или какова ваша арка процессора)
8 голосов
/ 29 июня 2011

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

7 голосов
/ 29 июня 2011

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

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

5 голосов
/ 29 июня 2011

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

...