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 .pcarchivo pkconfig , por pkgconfig --modversion glibclo que no es un corredor). Consulte también la excelente getconfsugerencia 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 glibcbugscript (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é gccva 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 -dumpmachinepuede ayudar, por ejemplo, para uclibc tiene un -uclibcsufijo, como puede gcc -dumpspecs | grep dynamic-linker. Esto también puede implicar el ABI.
gcc -print-file-name=libc.sole 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 -m32o -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 getconfque 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 -vmostrará la versión.
(FWIW, durante varios años con el software que usa autoconf, he tenido más problemas con las funciones gccy g++requisitos no verificados que con las funciones glibc verificadas).