Quel est le rôle de libc (glibc) dans notre application linux?
lorsque nous déboguons un programme en utilisant gdb, nous voyons habituellement des fonctions avec des noms étranges définis dans libc (glibc?). Mes questions sont:
- est-ce que libc/glibc est l'implémentation standard de certaines fonctions C/C++ standard comme "strcpy", "strlen", "malloc"?
- Ou n'est-il pas seulement de la première utilisation comme décrit ci-dessus, mais également de l'emballage des appels systèmes Unix/Linux comme "ouvrir","fermer","fctl"? Si c'est le cas, pourquoi ne pouvons-nous pas lancer des appels syscall directement, sans libc?
- est-ce que libc se composent d'un seul lib (.un or .donc), ou beaucoup de fichiers de lib (dans ce cas, libc est le nom général de cet ensemble de lib)? D'où viennent ces lib fichier(s) résident?
- Quelle est la différence entre libc et glibc?
4 réponses
libc
implémente les deux 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 sont dans libc
- la plupart des fonctions mathématiques sont dans libm
.
vous ne pouvez pas directement faire des appels système de la même manière que vous appelez des fonctions normales parce que les appels vers le noyau ne sont pas des appels de fonction normale, donc ils ne peuvent pas être résolus par le linker. Au lieu de cela, on utilise un langage d'assemblage spécifique à l'architecture. pour appeler dans le noyau, vous pouvez bien sûr écrire directement dans votre propre programme, mais vous n'avez pas besoin parce que libc
vous les fournit.
notez que sous Linux c'est la combinaison du noyau et libc
qui fournit L'API POSIX. libc
ajoute une valeur décente - 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 libc
- il fournit également l' libm
mentionné plus tôt, et d'autres bibliothèques de base comme libpthread
. Donc libc
est juste l'une des bibliothèques fournies par la glibc, et il existe d'autres implémentations de libc
autres que glibc.
en ce qui concerne les deux premières, glibc est à la fois la bibliothèque standard C (E. g, "standard C functions") et une enveloppe pour les appels système. Vous ne pouvez pas lancer des appels système directement parce que le compilateur ne sait pas comment -- glibc contient la "colle" qui est nécessaire pour lancer des appels système, qui est écrite dans assembly. (Il est possible de le réimposer vous-même, mais il y a beaucoup plus de problèmes qu'il n'en vaut la peine.)
(la bibliothèque standard c++ est une chose distincte; elle s'appelle libstdc++
.)
glibc n'est pas un seul .so
(Bibliothèque dynamique) fichier -- il y 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 C standard -- il y en a plusieurs. glibc est le plus couramment utilisé; d'autres comprennent eglibc, uclibc, et dietlibc.
C'est la "bibliothèque standard". C'est exactement comme "MSVCRTL" dans le monde Windows.
la bibliothèque Gnu standard library ("glibc") est l'implémentation de libc la plus courante (presque universelle? trouvés sur les systèmes Linux. Voici les fichiers pertinents sur un vieux système Linux SusE:
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 à la source complète de GLibc) le code):
Vous pouvez vérifier les informations détaillées sur "libc" et" glibc " à partir des pages man sur 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.