web-dev-qa-db-fra.com

Quel est le rôle de libc (glibc) dans notre application linux?

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:

  1. Est libc/glibc l'implémentation standard de certaines fonctions C/C++ standard comme strcpy, strlen, malloc?
  2. Ou s'agit-il non seulement de la première utilisation décrite ci-dessus, mais également d'un wrapper d'appels système Unix/Linux comme open, close, fctl? Si c'est le cas, pourquoi ne pouvons-nous pas émettre des appels système directement, sans libc?
  3. 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?
  4. Quelle est la différence entre libc et glibc?
56
basketballnewbie

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.

58
caf

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.

17
duskwuff

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

3
paulsm4

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.
1
Turgay Kale