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

Какова роль libc (glibc) в нашем приложении linux?

Когда мы отлаживаем программу с использованием gdb, мы обычно видим функции со странными именами, определенными в libc (glibc?). Мои вопросы:

  1. Является ли libc/glibc стандартной реализацией некоторых стандартных функций C/C++, таких как strcpy, strlen, malloc?
  2. Или это не только первое использование, как описано выше, но и оболочка системных вызовов Unix/Linux, таких как open, close, fctl? Если так, почему мы не можем выпускать системные вызовы напрямую, без libc?
  3. Содержит ли libc только один файл lib (.a или .so) или множество файлов lib (в данном случае libc - это общее название этого набора libc)? Где находятся эти файлы lib?
  4. В чем разница между libc и glibc?
4b9b3361

Ответ 1

libc реализует как стандартные функции C, такие как strcpy() и функции POSIX (которые могут быть системными вызовами), например getpid(). Обратите внимание, что не все стандартные функции C находятся в libc - большинство математических функций находятся в libm.

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

Обратите внимание, что в Linux это комбинация ядра и libc, которая предоставляет POSIX API. libc добавляет приличную величину - не каждая функция POSIX обязательно является системным вызовом, а для тех, которые являются, поведение ядра не всегда соответствует POSIX.

libc - это один файл библиотеки (доступны как версии .so, так и .a) и в большинстве случаев находится в /usr/lib. Однако проект glibc (GNU libc) предоставляет больше, чем просто libc - он также предоставляет libm, упомянутый ранее, и другие основные библиотеки, такие как libpthread. Таким образом, libc - это только одна из библиотек, предоставляемых glibc, и есть другие альтернативные реализации libc, отличные от glibc.

Ответ 2

Что касается первых двух, glibc является как стандартной библиотекой C (например, "стандартными функциями C" ), так и оболочкой для системных вызовов. Вы не можете выдавать системные вызовы напрямую, потому что компилятор не знает, как - glibc содержит "клей", который необходим для выдачи системных вызовов, который написан на сборке. (Это можно переопределить сами, но это гораздо больше проблем, чем того стоит.)

(Стандартная библиотека С++ - это отдельная вещь, она называется libstdc++.)

glibc - это не один файл .so (динамическая библиотека) - есть куча, но libc и libm являются наиболее часто используемыми двумя. Все статические и динамические библиотеки хранятся в /lib.

libc - это общий термин, используемый для обозначения всех стандартных библиотек C - их несколько. glibc является наиболее часто используемым; другие включают eglibc, uclibc и dietlibc.

Ответ 3

Это "стандартная библиотека". Это точно так же, как "MSVCRTL" в мире Windows.

Стандартная библиотека Gnu ( "glibc" ) - это реализация libc чаще всего (почти повсеместно?), найденная в системах Linux. Вот соответствующие файлы в старой системе SusE Linux:

ls -l /lib =>
-rwxr-xr-x  1 root root 1383527 2005-06-14 08:36 libc.so.6

ls -l /usr/lib =>
-rw-r--r--  1 root root 2580354 2005-06-14 08:20 libc.a
-rw-r--r--  1 root root     204 2005-06-14 08:20 libc.so

Эта ссылка должна отвечать на любые дополнительные вопросы, которые могут возникнуть (включая ссылки на полный и полный исходный код GLibc):

Ответ 4

Вы можете проверить подробную информацию о "libc" и "glibc" из man-страниц вашей системы Linux, введя "man libc" в оболочке, скопированную так, как показано ниже;

LIBC(7)      Linux Programmer Manual      LIBC(7)   

NAME
       libc - overview of standard C libraries on Linux

DESCRIPTION
       The term "libc" is commonly used as a shorthand for the "standard C library", a library of standard functions that can be
       used by all C programs (and sometimes by programs in other languages).  Because of some history (see below), use  of  the
       term "libc" to refer to the standard C library is somewhat ambiguous on Linux.

   glibc
       By  far  the most widely used C library on Linux is the GNU C Library ⟨http://www.gnu.org/software/libc/⟩, often referred
       to as glibc.  This is the C library that is nowadays used in all major Linux distributions.  It is  also  the  C  library
       whose details are documented in the relevant pages of the man-pages project (primarily in Section 3 of the manual).  Doc‐
       umentation of glibc is also available in the glibc manual, available via the command info libc.  Release 1.0 of glibc was
       made in September 1992.  (There were earlier 0.x releases.)  The next major release of glibc was 2.0, at the beginning of
       1997.

       The pathname /lib/libc.so.6 (or something similar) is normally a symbolic link that points to the location of  the  glibc
       library,  and executing this pathname will cause glibc to display various information about the version installed on your
       system.

   Linux libc
       In the early to mid 1990s, there was for a while Linux libc, a fork of glibc 1.x created by  Linux  developers  who  felt
       that  glibc  development  at  the  time  was  not  sufficing for the needs of Linux.  Often, this library was referred to
       (ambiguously) as just "libc".  Linux libc released major versions 2, 3, 4, and 5 (as well as many minor versions of those
       releases).  For a while, Linux libc was the standard C library in many Linux distributions.

       However, notwithstanding the original motivations of the Linux libc effort, by the time glibc 2.0 was released (in 1997),
       it was clearly superior to Linux libc, and all major Linux distributions that had been using  Linux  libc  soon  switched
       back to glibc.  Since this switch occurred long ago, man-pages no longer takes care to document Linux libc details.  Nev‐
       ertheless, the history is visible in vestiges of information about Linux libc that remain in some manual pages,  in  par‐
       ticular, references to libc4 and libc5.