web-dev-qa-db-fra.com

Vérifier la version glibc pour un compilateur gcc particulier

J'ai deux compilateurs gcc installés sur mon système, l'un est gcc 4.1.2 (par défaut) et l'autre est gcc 4.4.4. Comment puis-je vérifier la version libc utilisée par gcc 4.4.4, car /lib/libc.so.6 montre la glibc utilisée par gcc 4.1.2, puisqu'il s'agit du compilateur par défaut.

46
MetallicPriest

Écrivez un programme de test (nommez-le par exemple glibc-version.c):

#include <stdio.h>
#include <stdlib.h>
#include <gnu/libc-version.h>

int main(int argc, char *argv[]) {
  printf("GNU libc version: %s\n", gnu_get_libc_version());
  exit(EXIT_SUCCESS);
}

et compilez-le avec le compilateur gcc-4.4:

gcc-4.4 glibc-version.c -o glibc-version

Lorsque vous exécutez ./glibc-version la version utilisée de la glibc est affichée.

40
R1tschY

Utilisation -print-file-namegcc option:

$ gcc -print-file-name=libc.so
/usr/lib/gcc/x86_64-redhat-linux/4.5.1/../../../../lib64/libc.so

Cela donne le chemin. À présent:

$ file /usr/lib/gcc/x86_64-redhat-linux/4.5.1/../../../../lib64/libc.so
/usr/lib/gcc/x86_64-redhat-linux/4.5.1/../../../../lib64/libc.so: ASCII C program text

$ cat /usr/lib/gcc/x86_64-redhat-linux/4.5.1/../../../../lib64/libc.so
/* GNU ld script
   Use the shared library, but some functions are only in
   the static library, so try that secondarily.  */
OUTPUT_FORMAT(elf64-x86-64)
GROUP ( /lib64/libc.so.6 /usr/lib64/libc_nonshared.a  AS_NEEDED ( /lib64/ld-linux-x86-64.so.2 ) )

Ressemble à un script de l'éditeur de liens. libc est spécial sous Linux car il peut être exécuté:

$ /lib64/libc.so.6
GNU C Library stable release version 2.13, by Roland McGrath et al.
Copyright (C) 2011 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
Compiled by GNU CC version 4.5.1 20100924 (Red Hat 4.5.1-4).
Compiled on a Linux 2.6.35 system on 2011-08-05.
Available extensions:
    Support for some architectures added on, not maintained in glibc core.
    The C stubs add-on version 2.1.2.
    crypt add-on version 2.1 by Michael Glad and others
    GNU Libidn by Simon Josefsson
    Native POSIX Threads Library by Ulrich Drepper et al
    BIND-8.2.3-T5B
    RT using linux kernel aio
libc ABIs: UNIQUE IFUNC
For bug reporting instructions, please see:
<http://www.gnu.org/software/libc/bugs.html>.
31
Maxim Egorushkin

encore plus facile

utiliser ldd --version

Cela devrait renvoyer la version glibc utilisée, c'est-à-dire.

$ ldd --version

ldd (GNU libc) 2.17
Copyright (C) 2012 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO

...

qui est le même résultat que l'exécution de ma bibliothèque libc

$ /lib/libc.so.6 


GNU C Library (GNU libc) stable release version 2.17, by Roland McGrath et al.
Copyright (C) 2012 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.

...

29
John

gnu_get_libc_version identifie la version runtime de la bibliothèque GNU C).

Si vous vous souciez de la version au moment de la compilation (c'est-à-dire la version qui a fourni les en-têtes dans /usr/include), vous devriez regarder les macros __GLIBC__ et __GLIBC_MINOR__. Ceux-ci se développent en entiers positifs et seront définis comme un effet secondaire d'inclure tout fichier d'en-tête fourni par la bibliothèque GNU C; cela signifie que vous pouvez inclure un standard en-tête, puis utilisez #ifdef __GLIBC__ pour décider si vous pouvez inclure un en-tête non standard comme gnu/libc-version.h.

Extension du programme de test à partir de la réponse acceptée:

#include <stdio.h>
#ifdef __GLIBC__
#include <gnu/libc-version.h>
#endif

int
main(void)
{
#ifdef __GLIBC__
  printf("GNU libc compile-time version: %u.%u\n", __GLIBC__, __GLIBC_MINOR__);
  printf("GNU libc runtime version:      %s\n", gnu_get_libc_version());
  return 0;
#else
  puts("Not the GNU C Library");
  return 1;
#endif
}

Lorsque je compile et exécute ce programme sur l'ordinateur, je tape cette réponse (qui est un Mac), elle s'imprime

Not the GNU C Library

mais une fois compilé et exécuté sur une boîte Linux à proximité, il imprime

GNU libc compile-time version: 2.24
GNU libc runtime version:      2.24

Dans des circonstances normales, la version "runtime" peut être plus grande que la version "compile-time", mais jamais plus petite. Il est peu probable que le numéro de version majeur change à nouveau (la dernière fois qu'il a changé était la "transition libc6" en 1997).

Si vous préférez un "one-liner" Shell pour vider ces macros, utilisez:

echo '#include <errno.h>' | gcc -xc - -E -dM | 
    grep -E '^#define __GLIBC(|_MINOR)__ ' | sort

Le modèle grep est choisi pour correspondre uniquement aux deux macros pertinentes, car il existe des dizaines de macros internes nommées __GLIBC_somethingorother que vous ne voulez pas avoir à lire.

15
zwol

Je doute que vous ayez plus d'une glibc installée sur votre système. Mais ldd -v <path/to/gcc-4.x> devrait vous donner la glibc utilisée.

9
itisravi

La façon la plus simple est d'utiliser ldd qui vient avec glibc

Exécutez simplement cette commande ldd --version:

dina@dina-X450LA:~$ ldd --version
ldd (Ubuntu GLIBC 2.23-0ubuntu9) 2.23
Copyright (C) 2016 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Written by Roland McGrath and Ulrich Drepper.

Il existe deux façons supplémentaires de découvrir la version glibc:

  1. Vérifiez la version du package glibc rpm installé: ceci en exécutant cette commande

    rpm -q glibc

  2. Vérifiez la version du fichier libc.so utilisé. Cette façon est un peu plus difficile. Vous pouvez le vérifier dans ce lien: Linux: Vérifiez la version glibc

6
DINA TAKLIT