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.
É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.
Utilisation -print-file-name
gcc
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>.
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.
...
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.
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.
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:
Vérifiez la version du package glibc rpm installé: ceci en exécutant cette commande
rpm -q glibc
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