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 .pc
file pkconfig , quindi pkgconfig --modversion glibc
è un non-runner.) Vedi anche l'eccellente getconf
suggerimento 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 glibcbug
script (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 gcc
stai 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 -dumpmachine
può aiutare, ad es. per uclibc ha un -uclibc
suffisso, come può gcc -dumpspecs | grep dynamic-linker
. Ciò può anche implicare l'ABI.
gcc -print-file-name=libc.so
ti 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 -m32
o -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 getconf
che possono anche trarre in inganno (ho il sospetto che restituisce una risposta vuota per getconf GNU_LIBC_VERSION
la mia costruzione env è broncio oggi così non posso confermare.)
Nel caso improbabile che stai usando dietlibc , in esecuzione diet -v
verrà visualizzata la versione.
(FWIW, nel corso di diversi anni con il software che utilizza autoconf ho riscontrato più problemi con le funzionalità gcc
e i g++
requisiti non controllati che con le funzionalità glibc verificate.)