2010-01-25 17 views
6

Se faccio il seguente comando sul mio eseguibile chiamato "versione", compilata su Fedora Core 11, ottengo questa uscitaQual è il campo numero di versione nel output del comando file linux

versione del file

versione: ELF a 32 bit LSB eseguibile, Intel 80386, versione 1 (SYSV), in modo dinamico legato (utilizza librerie condivise), per GNU/Linux 2.6.18 , non spogliato

Qual è il significato del 2.6 .18 numero verso la fine, ed è qualsiasi uso in dis tinguendo ai clienti quale versione di alcuni software dovrebbero scaricare?

Da quello che ho guardato finora, questo numero è sicuramente non

  1. La versione del kernel
  2. La versione libc
  3. Niente a che fare con la lsb_release

I "Mi piacerebbe avere un identificatore facile per consentire ai clienti di sapere quale versione binaria devono scaricare, che dovrebbero idealmente essere in grado di identificare digitando un comando (come uname -a, anche se ovviamente è non quello in questo caso).

Grazie

risposta

7

E 'la versione del kernel della macchina del binario è stato compilato on. Se si utilizzano i binari precompilati dalla distribuzione, si tratta della versione del kernel di una macchina del fornitore di distribuzione, probabilmente nella sua farm di compilazione.

È pertinente ad es. quando si considerano le syscalls. Dite che il vostro binario usa il syscall no. X e si utilizza un kernel che non supporta ancora lo X o che ha assegnato a syscall no. X in un altro syscall.

L'API utente Linux Kernel vanilla è stabile. Ciò significa che ogni syscall disponibile nella versione Linux A è disponibile in Linux versione B se A <=B. Ma può accadere che alcuni sviluppatori pubblichino la propria versione di sviluppo di Linux (qualcosa come linux-2.6.18-xy) e implementa un nuovo syscall. Se ora compila un binario usando quella versione del kernel, il binario viene taggato con quella versione. Quindi, in seguito, sarai in grado di sapere che potrebbe funzionare o meno.

Btw, /usr/include/asm/unistd_32.h contiene i numeri syscall, estratto:

[...] 
#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

Grazie - in modo efficace, la versione minima del kernel che ha la compatibilità binaria con l'eseguibile? Ho scontato inizialmente una versione del kernel come un programma spaziale utente "dipende" (come l'output ldd) su libc.so, ma posso vedere il link lì. –

+0

Si potrebbe dire così. La verità è un po 'più sottile: non tutte le versioni del kernel portano nuove sysc e nei normali programmi si usano i wrapper syscall da libc. Quindi i numeri non sono codificati nel programma stesso ma in libc. Ma se un kernel ha inventato un nuovo syscall, il tuo programma dipende da questo, non puoi eseguire quel programma su un vecchio kernel ... –

+0

Sì - questo è quello che stavo pensando - come programma per gli utenti, non mi interessa kernel - solo libc. Ma naturalmente, la libc deve preoccuparsi del kernel, poiché collega lo spazio utente con il kernel.Quindi, in realtà, il numero è la versione del kernel su cui è stata compilata la libc, che viene dal fornitore (Fedora in questo caso). Grazie per il tuo tempo –

Problemi correlati