Die naheliegende, wenn auch nicht die umfassendste Antwort ist die Überprüfung Ihres Paketmanagers, z
rpm -qi glibc
dpkg -l libc6
(Leider hat glibc keine pkconfig- .pc
Datei, pkgconfig --modversion glibc
ist also kein Runner.) Siehe auch @ Gnoucs exzellenter getconf
Vorschlag.
Der einfachste Fall mit gcc + glibc und der, den ich meistens zuerst benutze, ist, einfach auszuführen libc.so
, wie in einigen anderen Antworten hier beschrieben. Es müssen keine Argumente übergeben werden, die Version wird standardmäßig ausgegeben. Dies funktioniert bis zu glibc-2.1 (glibc-2.0-seg-Fehler), obwohl Sie vor langer Zeit das (inzwischen zurückgezogene) glibcbug
Skript überprüfen konnten , um die Version zu bestätigen. Diese Methode funktioniert auch mit neueren (> 0.9.15) Versionen von musl-libc (die heute, am 20. März, erst 1.0 waren). Es funktioniert nicht mit uClibc, es segfaults.
Eine einfache Möglichkeit, genau zu sagen, was Sie gcc
tun werden, ist das Kompilieren:
#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;
}
(mit glibc, <stdio.h>
enthält , <features.h>
welche die entsprechenden GLIBC Makros definiert, müssen Sie <gnu/libc-version.h>
für die Funktionsdeklarationen.)
Dies erfasst komplexere Fälle (mehrere Bibliotheken und / oder mehrere Compiler), vorausgesetzt, Sie verwenden natürlich den richtigen Compiler (und die richtigen Flags). (Ich vermute, es wird jedoch nicht zwischen eglibc und glibc unterscheiden.)
Wenn Sie sicher sind Sie verwenden glibc (oder eglibc) , dann ld
wird auch die Version bestätigen (sorry, das ist nicht richtig).
Wenn __GNU_LIBRARY__
es nicht definiert ist, werden Sie Fehler bekommen, dann ist es Zeit für Plan B.
gcc -dumpmachine
kann helfen, zB für Uclibc hat es ein -uclibc
Suffix, wie kann gcc -dumpspecs | grep dynamic-linker
. Dies kann auch die ABI implizieren.
gcc -print-file-name=libc.so
wird Ihnen sagen, welche Datei der Compiler für " -lc
" verwenden wird. Dies ist mit ziemlicher Sicherheit ein Linker-Skript in Ihrer gcc-Installation, das Sie als Klartext lesen können. Das zeigt den genauen Pfad zu libc.so
. Dies funktioniert auch, wenn Sie Flags wie -m32
oder übergeben -m64
.
Für den Fall , verwenden Sie uclibc ( und wurden von OpenWRT und mehr), es definiert __UCLIBC_MAJOR__
, __UCLIBC_MINOR__
und __UCLIBC_SUBLEVEL__
als auch __UCLIBC__
in <features.h>
, so dass es leicht ist erkannt eine kleinere Variante des obigen C - Code - Snippet verwenden. Im Interesse der Kompatibilität kann uClibc auch die oben verwendeten GNU / GLIBC-Makros definieren, die derzeit als glibc-2.2 bezeichnet werden. Dabei spielt es keine derzeit die Umsetzung gnu_get_libc_X()
Funktionen, aber es nicht implementieren , getconf
die auch die Irre führen kann (ich vermute , es gibt eine leere Antwort getconf GNU_LIBC_VERSION
, mein Build env schmollt heute so kann ich nicht bestätigen.)
In dem unwahrscheinlichen Fall, dass Sie dietlibc verwenden , wird beim Ausführen diet -v
die Version angezeigt.
(FWIW, über mehrere Jahre hinweg hatte ich mit Software, die Autoconf verwendet, mehr Probleme mit ungeprüften Funktionen gcc
und g++
Anforderungen als mit auf glibc geprüften Funktionen.)