A resposta óbvia, embora não seja a mais abrangente, é verificar o seu gerenciador de pacotes, por exemplo
rpm -qi glibc
dpkg -l libc6
(Infelizmente, o glibc não possui um .pc
arquivo pkconfig , também pkgconfig --modversion glibc
não é um corredor.) Veja também a excelente getconf
sugestão do @ Gnouc .
O caso mais simples, com gcc + glibc, e o que mais uso primeiro é apenas executar libc.so
, conforme descrito em algumas das outras respostas aqui. Não há necessidade de passar nenhum argumento, ele exibe sua versão por padrão. Isso funciona desde o glibc-2.1 (glibc-2.0 seg-faults, embora na época você pudesse verificar o glibcbug
script (agora aposentado) para confirmar a versão). Este método também funciona com versões recentes (> 0.9.15) do musl-libc (que foi 1.0 hoje, 20 de março). Ele não funciona com o uClibc, é segmentado por falhas.
Uma maneira simples de saber exatamente o que você gcc
fará é compilar:
#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;
}
(com glibc, <stdio.h>
inclui o <features.h>
que define as macros GLIBC relevantes, você precisa <gnu/libc-version.h>
das declarações de função.)
Isso captura casos mais complexos (vários libc e / ou vários compiladores), supondo que você esteja usando o compilador (e sinalizadores) certo, é claro. (Suspeito que não faça distinção entre eglibc e glibc propriamente dito.)
Se você tiver certeza de que está usando o glibc (ou eglibc), ld
também confirmará a versão (desculpe, isso não está correto).
Se __GNU_LIBRARY__
não estiver definido, você receberá erros, é hora do plano B.
gcc -dumpmachine
pode ajudar, por exemplo, para uclibc, ele tem um -uclibc
sufixo, como pode gcc -dumpspecs | grep dynamic-linker
. Isso também pode implicar a ABI.
gcc -print-file-name=libc.so
lhe dirá qual arquivo o compilador usará para " -lc
", este é quase certamente um script vinculador dentro da instalação do gcc, que você pode ler como texto simples. Isso mostrará o caminho exato para libc.so
. Isso também funcionará se você estiver passando bandeiras como -m32
ou -m64
.
No caso de você estiver usando uClibc (como o usado por OpenWRT e mais), define __UCLIBC_MAJOR__
, __UCLIBC_MINOR__
e __UCLIBC_SUBLEVEL__
, assim como __UCLIBC__
em <features.h>
, por isso é facilmente detectada usando uma pequena variação no exposto C trecho de código. No interesse da compatibilidade, o uClibc também pode definir as macros GNU / GLIBC, conforme usado acima, atualmente fingindo ser glibc-2.2. Ele atualmente não implementar as gnu_get_libc_X()
funções, mas não implementar getconf
o que também pode induzir em erro (Eu suspeito que ele retorna uma resposta vazia para getconf GNU_LIBC_VERSION
, meu construir env está de mau humor hoje, por isso não posso confirmar.)
No caso improvável de usar dietlibc , a execução diet -v
exibirá a versão.
(FWIW, durante vários anos com software usando o autoconf, tive mais problemas com requisitos gcc
e g++
requisitos não verificados do que com os recursos glibc verificados.)