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
Respuesta
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.
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. –
La función es parte de Gnulib: https://www.gnu.org/software/gnulib/manual/gnulib.html – R1tschY
http://man7.org/linux/man-pages/man3/gnu_get_libc_version.3.html – Adam
Uso -print-file-name
gcc
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>.
oops, pensé que necesitabas el camino, mi mal. –
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.
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.
...
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
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
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. –
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.
Y a partir de los comentarios sobre una pregunta relacionada: 'echo '#include
- 1. Comprobar gcc minor en cmake
- 2. ¿Cómo puedo enlazar a una versión específica de glibc?
- 3. usa una versión diferente de glibc
- 4. compilador no compatible 'GCC 4.2' seleccionado para la arquitectura 'armv7'
- 5. Javascript: Comprobar si la página contiene un div en particular
- 6. valgrind no acepta la versión más reciente de glibc
- 7. ¿Cuáles son las macros predefinidas de gcc para el número de versión del compilador?
- 8. Compilador no compatible 'GCC 4.2' seleccionado para la arquitectura 'i386'
- 9. Instalación de la versión anterior de gcc
- 10. Añadir un compilador personalizado para XCode 3.2
- 11. La última versión de gcc para usar libstdC++. So.5
- 12. ¿Cómo redirigir la salida del compilador gcc a un archivo?
- 13. ¿Cómo imito la versión de Microsoft de __FUNCTION__ usando gcc?
- 14. C89 C99 vs compilador GCC
- 15. Comprobar la versión del instalador de Windows
- 16. ¿Cómo actualizar glibc de la versión 2.13 a la 2.15 en Debian?
- 17. Comprobar la versión de iOS en tiempo de ejecución?
- 18. gcc 4.3.3 opciones del compilador habilitadas de forma predeterminada
- 19. Generando sonido de una frecuencia particular usando gcc en ubuntu?
- 20. Profundidad de procesos en línea en el compilador GCC
- 21. MinGW GCC: compilador cruzado simple de 32 y 64 bits.
- 22. cómo sugieren compilador gcc más probable rama
- 23. Instalar una versión particular con easy_install
- 24. bibliotecas glibc múltiples en un único host
- 25. Encontrar proveedor de compilador/versión usando qmake
- 26. ¿Vale la pena el compilador de comeau en comparación con gcc?
- 27. Bit twiddling para comprobar si un número está en el rango particular
- 28. Git clone versión particular del repositorio remoto
- 29. ¿Por qué es gcc usando JMP para llamar a una función en la versión optimizada
- 30. ¿Existe una versión OO más moderna de "Construyamos un compilador"?
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