Lorsque nous déboguons un programme en utilisant gdb
, nous voyons généralement des fonctions avec des noms étranges définis dans libc
(glibc
?). Mes questions sont:
libc/glibc
l'implémentation standard de certaines fonctions C/C++ standard comme strcpy
, strlen
, malloc
?open
, close
, fctl
? Si c'est le cas, pourquoi ne pouvons-nous pas émettre des appels système directement, sans libc
?libc
ne comprend-il qu'une seule lib (.a
ou .so
), ou de nombreux fichiers lib (dans ce cas, libc
est le nom général de cet ensemble de bibliothèques)? Où résident ces fichiers lib?libc
et glibc
?libc
implémente à la fois les fonctions C standard comme strcpy()
et les fonctions POSIX (qui peuvent être des appels système) comme getpid()
. Notez que toutes les fonctions C standard ne sont pas dans libc
- la plupart des fonctions mathématiques sont dans libm
.
Vous ne pouvez pas effectuer directement d'appels système de la même manière que vous appelez des fonctions normales, car les appels au noyau ne sont pas des appels de fonction normaux, ils ne peuvent donc pas être résolus par l'éditeur de liens. Au lieu de cela, les thunks du langage d'assemblage spécifiques à l'architecture sont utilisés pour appeler dans le noyau - vous pouvez bien sûr les écrire directement dans votre propre programme, mais vous n'avez pas besoin de le faire car libc
les fournit pour vous.
Notez que sous Linux, c'est la combinaison du noyau et de libc
qui fournit l'API POSIX. libc
ajoute une quantité décente de valeur - toutes les fonctions POSIX ne sont pas nécessairement un appel système, et pour celles qui le sont, le comportement du noyau n'est pas toujours conforme à POSIX.
libc
est un fichier de bibliothèque unique (les deux .so
et .a
versions sont disponibles) et dans la plupart des cas, réside dans /usr/lib
. Cependant, le projet glibc (GNU libc) fournit plus que simplement libc
- il fournit également le libm
mentionné précédemment et d'autres bibliothèques de base comme libpthread
. Donc libc
n'est qu'une des bibliothèques fournies par glibc - et il existe d'autres implémentations alternatives de libc
autres que glibc.
En ce qui concerne les deux premiers, la glibc est à la fois la bibliothèque standard C (par exemple, "fonctions C standard") et un wrapper pour les appels système. Vous ne pouvez pas émettre d'appels système directement car le compilateur ne sait pas comment - glibc contient la "colle" nécessaire pour émettre des appels système, qui est écrite dans Assembly. (Il est possible de réimplémenter cela vous-même, mais c'est beaucoup plus difficile que cela ne vaut.)
(La bibliothèque standard C++ est une chose distincte; elle s'appelle libstdc++
.)
glibc n'est pas un seul .so
(bibliothèque dynamique) - il y en a un tas, mais libc et libm sont les deux plus couramment utilisés. Toutes les bibliothèques statiques et dynamiques sont stockées dans /lib
.
libc est un terme générique utilisé pour désigner toutes les bibliothèques standard C - il y en a plusieurs. la glibc est la plus utilisée; d'autres incluent eglibc, uclibc et dietlibc.
C'est la "bibliothèque standard". C'est exactement comme "MSVCRTL" dans le monde Windows.
La bibliothèque standard Gnu ("glibc") est l'implémentation de libc la plus courante (presque universelle?) Trouvée sur les systèmes Linux. Voici les fichiers pertinents sur un ancien système 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
Ce lien devrait répondre à toutes les questions supplémentaires que vous pourriez avoir (y compris les références au code source complet et complet de GLibc):
Vous pouvez vérifier les informations détaillées sur "libc" et "glibc" dans les pages de manuel de votre système Linux en tapant "man libc" sur le Shell, copié comme ci-dessous;
LIBC(7) Linux Programmer's 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.