La réponse évidente, bien que pas la plus complète, consiste à vérifier votre gestionnaire de paquets, par exemple:
rpm -qi glibc
dpkg -l libc6
(Malheureusement, glibc n'a pas de .pc
fichier pkconfig , il en pkgconfig --modversion glibc
va de même pour les non-coureurs.) Voir aussi l'excellente getconf
suggestion de @Gnouc .
Le cas le plus simple, avec gcc + glibc, et celui que j’utilise le plus souvent en premier lieu, consiste simplement à exécuter libc.so
, comme indiqué dans certaines des autres réponses données ici. Il n'est pas nécessaire de passer des arguments, il affiche sa version par défaut. Cela fonctionne aussi loin que glibc-2.1 (les défauts de segmentation de glibc-2.0, bien que vous ayez déjà pu vérifier le glibcbug
script (maintenant abandonné) pour confirmer la version). Cette méthode fonctionne également avec les versions récentes (> 0.9.15) de musl-libc (qui vient de passer à 1.0 aujourd'hui, le 20 mars). Cela ne fonctionne pas avec uClibc, il segfaults.
Un moyen simple de dire exactement ce que vous gcc
allez faire est de compiler:
#include <gnu/libc-version.h>
#include <stdio.h>
int main(int argc, char *argv[]) {
printf("%s %s\n",gnu_get_libc_version(),gnu_get_libc_release());
printf("glibc v%i %i.%i\n",__GNU_LIBRARY__,__GLIBC__,__GLIBC_MINOR__);
return 0;
}
(avec glibc, <stdio.h>
comprend <features.h>
qui définit les macros GLIBC pertinentes, vous avez besoin <gnu/libc-version.h>
pour les déclarations de fonction.)
Cela intercepte des cas plus complexes (plusieurs bibliothèques et / ou plusieurs compilateurs), en supposant que vous utilisiez le bon compilateur (et les bons indicateurs) bien sûr. (Je suppose que cela ne fera pas la distinction entre eglibc et glibc proprement dit.)
Si vous êtes certain d’utiliser glibc (ou eglibc), ld
la version sera également confirmée (désolé, ce n’est pas correct).
Si __GNU_LIBRARY__
n'est pas défini, vous obtiendrez des erreurs, alors il est temps pour le plan B.
gcc -dumpmachine
peut aider, par exemple pour uclibc, il a un -uclibc
suffixe, comme vous le pouvez gcc -dumpspecs | grep dynamic-linker
. Cela peut aussi impliquer l’ABI.
gcc -print-file-name=libc.so
vous dira quel fichier le compilateur utilisera pour " -lc
", il s'agit certainement d'un script d'éditeur de liens au sein de votre installation gcc, que vous pouvez lire en texte brut. Cela montrera le chemin exact pour libc.so
. Cela fonctionnera également si vous passez des drapeaux tels que -m32
ou -m64
.
Dans le cas où vous utilisez uclibc (tel qu'il est utilisé par OpenWRT et plus), il définit __UCLIBC_MAJOR__
, __UCLIBC_MINOR__
et __UCLIBC_SUBLEVEL__
ainsi que __UCLIBC__
dans <features.h>
, il est donc facile à détecter en utilisant une variation mineure sur l'extrait de code ci - dessus C. Dans un souci de compatibilité, uClibc peut également définir les macros GNU / GLIBC telles qu’utilisées ci-dessus, il prétend actuellement être glibc-2.2. Il ne met pas en œuvre actuellement les gnu_get_libc_X()
fonctions, mais il ne mettre en œuvre ce getconf
qui peut aussi induire en erreur (je soupçonne qu'il renvoie une réponse vide pour getconf GNU_LIBC_VERSION
ma construction env boude aujourd'hui , donc je ne peux pas confirmer.)
Dans le cas peu probable où vous utiliseriez dietlibc , l'exécution diet -v
affichera la version.
(FWIW, depuis plusieurs années avec le logiciel en utilisant autoconf j'ai eu plus de problèmes avec décochée-pour gcc
et les g++
exigences qu'avec le check-pour les fonctions de la glibc.)