2012-09-02 23 views
5

Siempre uso el comando file para verificar el tipo de archivo, principalmente después de compilar un nuevo proyecto para asegurarme de que todo está bien.comando de Linux "archivo" muestra "para GNU/Linux 2.6.24"

La salida es algo similar a la inferior:

proj_out: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), statically linked, for GNU/Linux 2.6.24, BuildID[sha1]=0x23d9f966854e09d721c6110d505247483dae02fe, stripped 

Mi pregunta es desde mi núcleo de Linux se actualiza a 3.0 o superior, ¿por qué se sigue mostrando que se compila para versiones anteriores de Linux?

for GNU/Linux 2.6.24 

¿Es todo lo relacionado con file comando o tengo que hacer nada para compilar mi proyecto más reciente contra el núcleo de Linux?

Gracias

+0

¿Qué versión de los encabezados de Linux se encuentra en '/ usr/src/linux'? – robert

+0

La salida del compilador no depende de la versión del kernel que está utilizando. Solo depende del compilador que estás usando. –

+0

Parece que tengo diferentes versiones de Linux aquí: mahdi @ XO0PS: ~ $ ls/usr/src/| grep linux linux-headers-2.6.38-14 linux-headers-2.6.38-14-generic-pae linux-headers-2.6.38-8 linux-headers-3.2.0-23 linux-headers -3.2.0-23-generic linux-headers-3.2.0-24 linux-headers-3.2.0-24-generic linux-headers-3.2.0-26 linux-headers-3.2.0-26-generic linux-headers-3.2.0-27 linux-headers-3.2.0-27-genéricos linux-headers-3.2.0-29 linux-headers-3.2.0-29-generic – mahdi

Respuesta

9

La versión del kernel que se muestra en el archivo en un archivo ejecutable no tiene nada que ver con el kernel instalado en su sistema. Coincide con la biblioteca C con la que se vinculó el programa en tiempo de compilación.

Su compilador C se dirige a una biblioteca C específica (generalmente glibc). A su vez, la biblioteca C se dirige a una API kernel (es decir, la biblioteca C está construida para un kernel específico). Esa es la versión que se muestra en el archivo .

No tiene que preocuparse por el mimetismo entre la versión del kernel mostrada por el archivo y la versión del kernel instalada en su máquina.

@REALFREE: puede intentar el siguiente experimento. Tal vez será ayuda a tener una idea de lo que está pasando:

 
$ uname -r 
3.10-2-amd64 
$ gcc -Wall -Werror hello.c -o hello 
$ readelf --notes ./hello 
Displaying notes found at file offset 0x0000021c with length 0x00000020: 
    Owner     Data size  Description 
    GNU     0x00000010  NT_GNU_ABI_TAG (ABI version tag) 
    OS: Linux, ABI: 2.6.32 

La información sobre la etiqueta ABI está contenida en un segmento llamado Elf NOTA. Esta información está escrita por el vinculador cuando se compila el programa. Coincide con la etiqueta ABI de la biblioteca C.

 
$ ldd ./hello 
     linux-vdso.so.1 (0x00007fffd31fe000) 
     libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f5f1a465000) 
     /lib64/ld-linux-x86-64.so.2 (0x00007f5f1a827000) 
$ readelf --notes /lib/x86_64-linux-gnu/libc.so.6 
Displaying notes found at file offset 0x00000294 with length 0x00000020: 
    Propriétaire  Taille des données  Description 
    GNU     0x00000010  NT_GNU_ABI_TAG (étiquette de version ABI) 
    OS: Linux, ABI: 2.6.32 

el fin de construir la biblioteca C, tiene que seleccionar una versión del núcleo . Aquí, la biblioteca C se compiló para un núcleo 2.6.32 pero también funciona con kernels más recientes. Sin embargo, si el programa se ejecuta en un núcleo anterior a 2.6.32, se muestra un núcleo demasiado antiguo advertencia .

+0

Gracias. Es una información completa que proporciona. – mahdi

+0

Me preguntaba por qué son diferentes? Encontré la misma situación que el archivo compilado usa 2.6.24 pero la versión del kernel instalada en la máquina es 3.2.0-52 – REALFREE

2

Ese número de versión se refiere a las cabeceras del núcleo a partir del cual la biblioteca glibc C fue construido en el host que el compilador se ejecuta en. En general, muestra el nivel de kernel que se espera que soporte el ejecutable.

+0

Gracias. Por lo tanto, está relacionado con las bibliotecas que uso en mi proyecto y no tengo nada que cambiar aquí. – mahdi

Cuestiones relacionadas