2010-01-25 12 views
6

Si je la commande suivante sur mon exécutable appelé « version », compilé sur Fedora Core 11, je reçois cette sortieQuel est le champ de numéro de version dans la sortie de la commande de fichier linux

version du fichier

Version: ELF 32-bit exécutable LSB, Intel 80386, version 1 (SYSV), liée dynamiquement (utilise les librairies partagées), pour GNU/Linux 2.6.18 , pas dépouillé

Quelle est la signification de la 2.6 .18 nombre vers la fin, et est-ce une utilisation en dis tinguishing aux clients quelle version de certains logiciels ils devraient télécharger?

D'après ce que je l'ai regardé jusqu'à présent, ce nombre est certainement pas

  1. La version du noyau
  2. La version libc
  3. Rien à voir avec le lsb_release

I J'aimerais obtenir un identifiant simple pour permettre aux clients de savoir quelle version binaire ils devraient télécharger, qu'ils devraient idéalement pouvoir identifier en tapant une commande (comme uname -a, bien que cela soit évidemment pas celui dans ce cas).

Merci

Répondre

7

Il est la version du noyau de la machine le binaire a été compilé sur. Si vous utilisez des binaires précompilés de votre distribution, c'est la version du noyau d'une machine du fournisseur de distribution, probablement dans sa ferme de compilation.

Il est pertinent, par ex. lors de l'examen des appels système. Dites que votre binaire utilise le syscall non. X et vous utilisez un noyau qui ne supporte pas X encore ou pire a assigné syscall non. X à un appel système différent.

L'API utilisateur du noyau Linux de vanilla est stable. Cela signifie que chaque appel système disponible dans la version Linux A est disponible dans la version Linux B si A <=B. Mais il peut arriver qu'un développeur libère sa propre version de développement de Linux (quelque chose comme linux-2.6.18-xy) et qu'il implémente un nouveau syscall. Si il/elle compile maintenant un binaire en utilisant cette version du noyau, le binaire est étiqueté avec cette version. Ainsi, vous êtes plus tard capable de savoir que cela peut ou peut ne pas fonctionner.

BTW, /usr/include/asm/unistd_32.h contient les numéros de syscall, extrait:

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

Merci - de manière efficace, la version minimale du noyau qui a une compatibilité binaire avec l'exécutable? Au départ, je ne pensais à une version du noyau que comme un programme d'espace utilisateur "dépend" (comme la sortie ldd) sur libc.so, mais je peux voir le lien ici. –

+0

Vous pouvez le dire. La vraie vérité est un peu plus subtile: toutes les versions de noyau n'apportent pas de nouveaux appels système AND dans les programmes normaux, vous utilisez des wrappers syscall de libc. Donc, les chiffres ne sont pas codés en dur dans le programme lui-même mais dans libc. Mais SI un noyau a inventé un nouveau syscall, votre programme en dépend, vous ne pouvez pas exécuter ce programme sur un noyau plus ancien ... –

+0

Oui - c'est ce que je pensais - en tant que programme d'espace utilisateur, je m'en fiche de la noyau - seulement libc. Mais bien sûr, libc doit se préoccuper du noyau, car il comble l'espace utilisateur avec le noyau.Donc, vraiment, le numéro est la version du noyau sur laquelle la libc a été compilée, qui vient du fournisseur (Fedora dans ce cas). Merci pour votre temps –