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:

  1. est-ce que libc/glibc est l'implémentation standard de certaines fonctions C/C++ standard comme "strcpy", "strlen", "malloc"?
  2. 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?
  3. 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?
  4. Quelle est la différence entre libc et glibc?
32
demandé sur Mat 2012-07-07 10:37:47

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.

44
répondu caf 2012-07-07 07:28:22

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.

13
répondu duskwuff 2012-07-07 07:27:20

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):

1
répondu paulsm4 2012-07-07 06:50:43

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.
0
répondu Turgay 2018-02-19 13:21:27