2010-01-25 6 views
6

¿Si el comando siguiente en mi ejecutable llamado "versión", compilado en Fedora Core 11, consigo esta salida¿Cuál es el campo de número de versión en la salida del comando de archivos de Linux

versión del archivo

versión: ELF 32-bits LSB ejecutable, Intel 80386, versión 1 (SYSV), vinculada de forma dinámica (que usan bibliotecas compartidas), para GNU/Linux 2.6.18 , no despojado

¿Cuál es la importancia de la 2.6 .18 número hacia el final, y ¿hay algún uso en dis Tinguishing a los clientes qué versión de algún software deberían descargar?

Por lo que he visto hasta ahora, este número es definitivamente no

  1. La versión del núcleo
  2. La versión de libc
  3. nada que ver con la lsb_release

I Me gustaría obtener un identificador fácil para que los clientes sepan qué versión binaria deben descargar, lo que idealmente deberían ser capaces de identificar escribiendo un comando (como uname -a, aunque eso obviamente no el de este caso).

Gracias

Respuesta

7

Es la versión del kernel de la máquina era el binario compilado sucesivamente. Si usa binarios precompilados de su distribución, es la versión de kernel de una máquina del proveedor de distribución, probablemente en su granja de compilación.

Es relevante p. al considerar syscalls. Digamos que su binario usa el syscall no. X y utiliza un kernel que no es compatible con X o peor ha asignado syscall no. X a un syscall diferente.

La API de usuario del Kernel Linux vainilla es estable. Eso significa que cada syscall disponible en la versión de Linux A está disponible en la versión de Linux B si A <=B. Pero puede suceder que algún desarrollador publique su propia versión de desarrollo de Linux (algo así como linux-2.6.18-xy) y que implemente un nuevo syscall. Si él/ella ahora compila un binario usando esa versión del núcleo, el binario se etiqueta con esa versión. Por lo tanto, más adelante podrá saber que puede funcionar o no.

Por cierto, /usr/include/asm/unistd_32.h contiene los números de llamada al sistema Extracto:

[...] 
#define __NR_restart_syscall  0 
#define __NR_exit   1 
#define __NR_fork   2 
#define __NR_read   3 
#define __NR_write  4 
#define __NR_open   5 
[...] 
+0

, gracias - de manera eficaz, la versión mínima del núcleo que tiene compatibilidad binaria con el ejecutable? Desconocí inicialmente una versión de kernel como un programa de espacio de usuario que solo "depende" (como salida ldd) en libc.so, pero puedo ver el enlace allí. –

+0

Podrías decirlo. La verdad es un poco más sutil: no todas las versiones de kernel ofrecen nuevas llamadas a los sistemas Y en los programas normales se usan los contenedores de syscall de libc. Entonces los números no están codificados en el programa en sí, sino en libc. Pero si un kernel inventó un nuevo syscall, su programa depende de él, no puede ejecutar ese programa en un kernel anterior ... –

+0

Sí - eso es lo que estaba pensando - como programa de espacio de usuario, no me importa el kernel - solo libc. Pero, por supuesto, libc debe preocuparse por el kernel, ya que une el espacio de usuario con el kernel.Entonces, realmente, el número es la versión del kernel contra la que se compiló libc, que proviene del proveedor (Fedora en este caso). Gracias por su tiempo –

Cuestiones relacionadas