Existe-t-il une différence entre les fichiers binaires exécutables entre les distributions?

StackOverflow https://stackoverflow.com/questions/1030238

  •  06-07-2019
  •  | 
  •  

Question

Toutes les distributions Linux utilisant le même noyau, existe-t-il une différence entre leurs fichiers binaires exécutables?

Si oui, quelles sont les principales différences? Ou cela signifie-t-il que nous pouvons construire un fichier exécutable Linux universel?

Était-ce utile?

La solution

Toutes les distributions Linux utilisent le même format ELF au format binaire, mais il existe encore quelques différences:

  1. différents processeurs utilisent un jeu d’instructions différent.
  2. la même machine cpu peut utiliser différents ABI, ABI définit comment utiliser le fichier de registre, comment appeler / retourner une routine. Différentes ABI ne peuvent pas travailler ensemble.
  3. Même sur le même arch, le même ABI, cela ne signifie toujours pas que nous pouvons copier un fichier binaire d'une distribution à une autre. Comme la plupart des fichiers binaires ne sont pas liés statiquement, ils dépendent donc des bibliothèques de la distribution, ce qui signifie qu'une distribution différente peut utiliser différentes versions ou une configuration de compilation différente pour les bibliothèques.

Donc, si vous souhaitez que votre programme fonctionne sur toutes les distributions, vous devrez peut-être lier statiquement une version qui dépend du syscall du noyau uniquement. Même si cela ne vous permet pas d'exécuter l'archive spécifiée.

Si vous voulez vraiment exécuter un programme sur n’importe quelle archive, vous devez compiler les fichiers binaires de toutes les arches et utiliser un script shell pour démarrer le bon.

Autres conseils

Tous les ports Linux (c’est-à-dire le noyau Linux sur différents processeurs) utilisent ELF comme format de fichier pour les exécutables et les bibliothèques. Un fichier binaire ELF spécifique est étiqueté avec une architecture / système d’exploitation unique sur laquelle il peut s’exécuter (bien que certains systèmes d’exploitation soient compatibles pour exécuter des fichiers binaires ELF à partir d’autres systèmes).

La plupart des ports prennent en charge l'ancien format a.out . (Certains processeurs sont suffisamment nouveaux pour qu’il n’existe jamais d’exécutables a.out.)

Certains ports prennent également en charge d'autres formats de fichiers exécutables. Par exemple, le port PA-RISC prend en charge les anciens fichiers exécutables de SOM . et les ports & # 956; cLinux (nonmmu) prennent en charge leur propre format FLAT.

Linux a également binfmt_misc , ce qui permet l'espace utilisateur pour enregistrer les gestionnaires pour les formats binaires arbitraires. Certaines distributions en tirent parti pour pouvoir exécuter des applications Windows, .NET ou Java. Un interpréteur est toujours en cours de lancement, mais il est complètement transparent pour l'utilisateur.

Linux sur Alpha prend en charge le chargement des fichiers binaires Intel exécutés via l'émulateur em86 .

Il est possible d'enregistrer binfmt_misc pour les exécutables d'autres architectures, à exécuter avec qemu- utilisateur .

En théorie, on pourrait créer un nouveau format - peut-être enregistrer une nouvelle "architecture". dans ELF - pour les gros binaires. Ensuite, le chargeur binfmt du noyau devrait être renseigné sur ce nouveau format, et vous ne voudriez pas manquer l’éditeur de liens dynamique ld-linux.so et l’ensemble de la construction. toolchain. Une telle fonctionnalité suscite peu d'intérêt et, autant que je sache, personne ne travaille sur quoi que ce soit de la sorte.

Presque tous les fichiers de programme linux utilisent la norme ELF .

Les anciens Unix utilisaient également le format COFF . Vous pouvez toujours trouver des exécutables d’époques antérieures dans ce format. Linux est toujours supporté (je ne sais pas s'il est compilé dans les distributions actuelles).

Si vous souhaitez créer un programme qui exécute toutes les distributions Linux, vous pouvez envisager d'utiliser des langages de script (tels que Python et Perl ). ou un langage de programmation indépendant de la plate-forme tel que Java .

Les programmes écrits dans des langages de script sont conformes au moment de l’exécution, ce qui signifie qu’ils sont toujours compilés pour correspondre à la plate-forme sur laquelle ils sont exécutés. Ils doivent donc toujours fonctionner (étant donné que les bibliothèques sont correctement configurées).

Les programmes écrits en Java , en revanche, sont compilés avant leur distribution, mais peuvent être exécutés sur n’importe quelle distribution Linux tant qu’une machine virtuelle Java est installée.

De plus, les programmes écrits en Java peuvent être exécutés sur d'autres systèmes d'exploitation, tels que MS Windows et Mac OS .

Il en va de même pour de nombreux programmes écrits en Python et Perl ; Toutefois, le fait qu'un programme Python ou Perl fonctionne sur un autre système d'exploitation dépend des bibliothèques utilisées par ce programme et de la disponibilité de ces bibliothèques sur les autres systèmes d'exploitation.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top