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- .pcDatei, pkgconfig --modversion glibcist also kein Runner.) Siehe auch @ Gnoucs exzellenter getconfVorschlag.
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) glibcbugSkript ü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 gcctun 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 ldwird 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 -dumpmachinekann helfen, zB für Uclibc hat es ein -uclibcSuffix, wie kann gcc -dumpspecs | grep dynamic-linker. Dies kann auch die ABI implizieren.
gcc -print-file-name=libc.sowird 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 -m32oder ü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 , getconfdie 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 -vdie Version angezeigt.
(FWIW, über mehrere Jahre hinweg hatte ich mit Software, die Autoconf verwendet, mehr Probleme mit ungeprüften Funktionen gccund g++Anforderungen als mit auf glibc geprüften Funktionen.)