La respuesta obvia, aunque no es la más completa, es verificar su administrador de paquetes, por ej.
rpm -qi glibc
dpkg -l libc6
(Lamentablemente, glibc no tiene un .pc
archivo pkconfig , por pkgconfig --modversion glibc
lo que no es un corredor). Consulte también la excelente getconf
sugerencia de @Gnouc .
El caso más simple, con gcc + glibc, y el que mayormente uso primero es simplemente ejecutar libc.so
, como se describe en algunas de las otras respuestas aquí. No es necesario pasar ningún argumento, genera su versión por defecto. Esto funciona hasta glibc-2.1 (glibc-2.0 seg-faults, aunque en ese entonces podría verificar el glibcbug
script (ahora retirado) para confirmar la versión). Este método también funciona con versiones recientes (> 0.9.15) de musl-libc (que acaba de ser 1.0 hoy, 20 de marzo). No funciona con uClibc, se daña por defecto.
Una manera simple de saber exactamente qué gcc
va a hacer es 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;
}
(con glibc, que <stdio.h>
incluye <features.h>
las macros GLIBC relevantes que necesita <gnu/libc-version.h>
para las declaraciones de funciones).
Esto detecta casos más complejos (múltiples libc y / o múltiples compiladores), suponiendo que esté utilizando el compilador (y las banderas) correctos, por supuesto. (Sin embargo, sospecho que no distinguirá entre eglibc y glibc propiamente dicho).
Si está seguro de que está usando glibc (o eglibc) ld
, también confirmará la versión (lo siento, esto no es correcto).
Si __GNU_LIBRARY__
no está definido, obtendrá errores, entonces es hora del plan B.
gcc -dumpmachine
puede ayudar, por ejemplo, para uclibc tiene un -uclibc
sufijo, como puede gcc -dumpspecs | grep dynamic-linker
. Esto también puede implicar el ABI.
gcc -print-file-name=libc.so
le dirá qué archivo utilizará el compilador para " -lc
", es casi seguro que es un script vinculador dentro de su instalación de gcc, que puede leer como texto sin formato. Eso mostrará la ruta exacta a libc.so
. Esto también funcionará si está pasando banderas como -m32
o -m64
.
En el caso de que esté usando uclibc (como lo usa OpenWRT y más), define __UCLIBC_MAJOR__
, __UCLIBC_MINOR__
y __UCLIBC_SUBLEVEL__
también __UCLIBC__
en <features.h>
, por lo que se detecta fácilmente usando una variación menor en el fragmento de código C anterior. En aras de la compatibilidad, uClibc también puede definir las macros GNU / GLIBC como se usa anteriormente, actualmente pretende ser glibc-2.2. Actualmente no implementa las gnu_get_libc_X()
funciones, pero sí implementa lo getconf
que también puede inducir a error (sospecho que devuelve una respuesta vacía para getconf GNU_LIBC_VERSION
, mi entorno de compilación está de mal humor hoy, así que no puedo confirmar).
En el improbable caso de que esté usando dietlibc , la ejecución diet -v
mostrará la versión.
(FWIW, durante varios años con el software que usa autoconf, he tenido más problemas con las funciones gcc
y g++
requisitos no verificados que con las funciones glibc verificadas).