2012-03-14 11 views
21

Tengo dos compiladores gcc instalados en mi sistema, uno es gcc 4.1.2 (predeterminado) y el otro es gcc 4.4.4. ¿Cómo puedo comprobar la versión de libc utilizada por gcc 4.4.4, porque /lib/libc.so.6 muestra el glibc utilizado por gcc 4.1.2, ya que es el compilador predeterminado.Comprobar la versión de glibc para un compilador gcc en particular

+0

Si desea realizar el control en tiempo de compilación, entonces la respuesta de Zwol a continuación es probablemente el mejor método. Si desea verificar la versión en tiempo de ejecución, entonces la respuesta de R1tschY es probablemente el mejor método. Tenga en cuenta que es posible que no obtenga la versión Glibc o la versión estándar de la biblioteca C++ que espera en el tiempo de ejecución debido a la incapacidad de Linux para obtener las rutas por sí mismo. También vea [Vincular g ++ 4.8 a libstdC++] (https://stackoverflow.com/q/17220872/608639) – jww

Respuesta

21

Escribir un programa de prueba (nombre que, por ejemplo, glibc-version.c):

#include <stdio.h> 
#include <stdlib.h> 
#include <gnu/libc-version.h> 

int main(int argc, char *argv[]) { 
    printf("GNU libc version: %s\n", gnu_get_libc_version()); 
    exit(EXIT_SUCCESS); 
} 

y compilar con gcc-4.4 del compilador:

gcc-4.4 glibc-version.c -o glibc-version 

Al ejecutar ./glibc-version la versión glibc utilizado es mostrado.

+0

me funciona, pero ¿dónde está esto docummented? Estoy buscando [en glibc 2.7 docs] (http://www.gnu.org/software/libc/manual/html_mono/libc.html) pero no puedo encontrarlo. –

+0

La función es parte de Gnulib: https://www.gnu.org/software/gnulib/manual/gnulib.html – R1tschY

+0

http://man7.org/linux/man-pages/man3/gnu_get_libc_version.3.html – Adam

25

Uso -print-file-namegcc opción:

$ gcc -print-file-name=libc.so 
/usr/lib/gcc/x86_64-redhat-linux/4.5.1/../../../../lib64/libc.so 

que da el camino. Ahora:

$ file /usr/lib/gcc/x86_64-redhat-linux/4.5.1/../../../../lib64/libc.so 
/usr/lib/gcc/x86_64-redhat-linux/4.5.1/../../../../lib64/libc.so: ASCII C program text 

$ cat /usr/lib/gcc/x86_64-redhat-linux/4.5.1/../../../../lib64/libc.so 
/* GNU ld script 
    Use the shared library, but some functions are only in 
    the static library, so try that secondarily. */ 
OUTPUT_FORMAT(elf64-x86-64) 
GROUP (/lib64/libc.so.6 /usr/lib64/libc_nonshared.a AS_NEEDED (/lib64/ld-linux-x86-64.so.2)) 

Parece una secuencia de comandos del enlazador. libc es especial en Linux, ya que puede ser ejecutado:

$ /lib64/libc.so.6 
GNU C Library stable release version 2.13, by Roland McGrath et al. 
Copyright (C) 2011 Free Software Foundation, Inc. 
This is free software; see the source for copying conditions. 
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A 
PARTICULAR PURPOSE. 
Compiled by GNU CC version 4.5.1 20100924 (Red Hat 4.5.1-4). 
Compiled on a Linux 2.6.35 system on 2011-08-05. 
Available extensions: 
    Support for some architectures added on, not maintained in glibc core. 
    The C stubs add-on version 2.1.2. 
    crypt add-on version 2.1 by Michael Glad and others 
    GNU Libidn by Simon Josefsson 
    Native POSIX Threads Library by Ulrich Drepper et al 
    BIND-8.2.3-T5B 
    RT using linux kernel aio 
libc ABIs: UNIQUE IFUNC 
For bug reporting instructions, please see: 
<http://www.gnu.org/software/libc/bugs.html>. 
+0

oops, pensé que necesitabas el camino, mi mal. –

8

dudo si tiene instalado en su system.But ldd -v <path/to/gcc-4.x> más de un glibc debe darle la glibc utilizado.

9

aún más fácil

uso LDD --version

Esto debería devolver la versión de glibc que se utiliza es decir

$ ldd --version 

ldd (GNU libc) 2.17 
Copyright (C) 2012 Free Software Foundation, Inc. 
This is free software; see the source for copying conditions. There is NO 

...

que es el mismo resultado que el funcionamiento de mi biblioteca libc

$ /lib/libc.so.6 


GNU C Library (GNU libc) stable release version 2.17, by Roland McGrath et al. 
Copyright (C) 2012 Free Software Foundation, Inc. 
This is free software; see the source for copying conditions. 

...

+0

Los resultados de los comandos anteriores no son los mismos. En mi computadora: versión GNU libc: 2.17, ld-linux-x86-64.so.2 (GLIBC_2.3) => /lib64/ld-linux-x86-64.so.2 ?? – Adam

-1

Puede utilizar el comando strings para verificar la versión GLIBC del compilador. La versión más alta es aplicable.

ubuntu1604:extra$ strings ./arm-unknown-linux-gnueabi/bin/arm-unknown-linux-gnueabi-gcc | grep GLIBC 
    GLIBC_2.3 
    GLIBC_2.8 
    GLIBC_2.14 
    GLIBC_2.4 
    GLIBC_2.11 
    GLIBC_2.2.5 
    GLIBC_2.3.4 
+1

Tenga en cuenta que esto realmente no le dice la versión. Supongamos que el binario estaba vinculado contra glibc 2.17, pero no hizo referencia a ningún símbolo con versiones de símbolos posteriores a 'GLIBC_2.14'. Entonces podría producir fácilmente la misma lista de versiones de símbolos. –

6

gnu_get_libc_version identifica la versión de tiempo de ejecución de la biblioteca C de GNU.

Si lo que te importa es la versiónen tiempo de compilación (es decir, la versión que proporciona las cabeceras en /usr/include), usted debe buscar en las macros __GLIBC__ y __GLIBC_MINOR__. Estos se expanden a enteros positivos, y se definirán como un efecto secundario de incluir cualquier archivo de encabezado provisto por la Biblioteca GNU C; esto significa que puede incluir un encabezado estándar y luego usar #ifdef __GLIBC__ para decidir si puede incluir un encabezado no estándar como gnu/libc-version.h.

La ampliación del programa de pruebas de la respuesta aceptada:

#include <stdio.h> 
#ifdef __GLIBC__ 
#include <gnu/libc-version.h> 
#endif 

int 
main(void) 
{ 
#ifdef __GLIBC__ 
    printf("GNU libc compile-time version: %u.%u\n", __GLIBC__, __GLIBC_MINOR__); 
    printf("GNU libc runtime version:  %s\n", gnu_get_libc_version()); 
    return 0; 
#else 
    puts("Not the GNU C Library"); 
    return 1; 
#endif 
} 

Cuando compilar y ejecutar este programa en el equipo que estoy escribiendo esta respuesta en (que es un Mac) se imprime

Not the GNU C Library 

pero cuando se compila y ejecuta en una máquina Linux cercana imprime

GNU libc compile-time version: 2.24 
GNU libc runtime version:  2.24 

en la Norma En las circunstancias, la versión "runtime" podría ser más grande que la versión "compile-time", pero nunca más pequeña. Es poco probable que el número de versión principal vuelva a cambiar (la última vez que cambió fue la "transición libc6" en 1997).

Si prefiere una cáscara 'de una sola línea' para volcar estas macros, utilice:

echo '#include <errno.h>' | gcc -xc - -E -dM | 
    grep -E '^#define __GLIBC(|_MINOR)__ ' | sort 

El patrón grep se elige para que coincida con sólo los dos macros que son relevantes, porque hay de interior decenas macros llamadas __GLIBC_somethingorother que no desea leer.

+0

Y a partir de los comentarios sobre una pregunta relacionada: 'echo '#include ' | gcc -x c -dM -E - | egrep -i '(gnu | lib)' '. – jww

Cuestiones relacionadas