La risposta ovvia, sebbene non la più completa, è controllare il gestore dei pacchetti, ad es
rpm -qi glibc
dpkg -l libc6
(Purtroppo, glibc non ha un .pcfile pkconfig , quindi pkgconfig --modversion glibcè un non-runner.) Vedi anche l'eccellente getconfsuggerimento di @ Gnouc .
Il caso più semplice, con gcc + glibc, e quello che uso principalmente per primo è quello di eseguire libc.so, come indicato in alcune delle altre risposte qui. Non è necessario passare alcun argomento, per impostazione predefinita restituisce la sua versione. Questo funziona fino a glibc-2.1 (glibc-2.0 seg-faults, anche se fino a quel momento si poteva controllare lo glibcbugscript (ora ritirato) per confermare la versione). Questo metodo funziona anche con le versioni recenti (> 0.9.15) di musl-libc (che è appena arrivato 1.0 oggi, 20 marzo). Non funziona con uClibc, segfaults.
Un modo semplice per dire esattamente cosa gccstai per fare è compilare:
#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;
}
(con glibc, <stdio.h>include <features.h>quale definisce le macro GLIBC pertinenti, è necessario <gnu/libc-version.h>per le dichiarazioni di funzione.)
Questo cattura casi più complessi (più libc e / o più compilatori), supponendo che tu stia usando il compilatore giusto (e flag) ovviamente. (Ho il sospetto che non distinguerà tra eglibc e glibc proprio.)
Se sei sicuro di usare glibc (o eglibc) ld, confermerai anche la versione (scusa, non è corretto).
Se __GNU_LIBRARY__non viene definito, verranno visualizzati errori, quindi è il momento del piano B.
gcc -dumpmachinepuò aiutare, ad es. per uclibc ha un -uclibcsuffisso, come può gcc -dumpspecs | grep dynamic-linker. Ciò può anche implicare l'ABI.
gcc -print-file-name=libc.soti dirà quale file utilizzerà il compilatore " -lc", questo è quasi certamente uno script linker all'interno della tua installazione di gcc, che puoi leggere come testo semplice. Ciò mostrerà il percorso esatto per libc.so. Questo funzionerà anche se stai passando bandiere come -m32o -m64.
Nel caso in cui si utilizzi uclibc (usati per OpenWRT e più), definisce __UCLIBC_MAJOR__, __UCLIBC_MINOR__e __UCLIBC_SUBLEVEL__così come __UCLIBC__in <features.h>, quindi è facilmente rilevabile mediante una variazione minore di quanto sopra C frammento di codice. Nell'interesse della compatibilità, uClibc può anche definire le macro GNU / GLIBC come usate sopra, attualmente finge di essere glibc-2.2. E 'attualmente non implementare le gnu_get_libc_X()funzioni, ma non implementare getconfche possono anche trarre in inganno (ho il sospetto che restituisce una risposta vuota per getconf GNU_LIBC_VERSIONla mia costruzione env è broncio oggi così non posso confermare.)
Nel caso improbabile che stai usando dietlibc , in esecuzione diet -vverrà visualizzata la versione.
(FWIW, nel corso di diversi anni con il software che utilizza autoconf ho riscontrato più problemi con le funzionalità gcce i g++requisiti non controllati che con le funzionalità glibc verificate.)