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 .pcfichier pkconfig , il en pkgconfig --modversion glibcva de même pour les non-coureurs.) Voir aussi l'excellente getconfsuggestion 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 glibcbugscript (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 gccallez 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), ldla 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 -dumpmachinepeut aider, par exemple pour uclibc, il a un -uclibcsuffixe, comme vous le pouvez gcc -dumpspecs | grep dynamic-linker. Cela peut aussi impliquer l’ABI.
gcc -print-file-name=libc.sovous 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 -m32ou -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 getconfqui peut aussi induire en erreur (je soupçonne qu'il renvoie une réponse vide pour getconf GNU_LIBC_VERSIONma construction env boude aujourd'hui , donc je ne peux pas confirmer.)
Dans le cas peu probable où vous utiliseriez dietlibc , l'exécution diet -vaffichera 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 gccet les g++exigences qu'avec le check-pour les fonctions de la glibc.)