GNU/Linux >> Tutoriels Linux >  >> Linux

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

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 binaire ELF spécifique est étiqueté avec une architecture/un système d'exploitation unique sur lequel il peut s'exécuter (bien que certains systèmes d'exploitation soient compatibles pour exécuter des binaires ELF à partir d'autres systèmes d'exploitation).

La plupart des ports prennent en charge l'ancien format a.out. (Certains processeurs sont suffisamment récents pour qu'il n'y ait jamais eu d'exécutables a.out pour eux.)

Certains ports prennent également en charge d'autres formats de fichiers exécutables; par exemple, le port PA-RISC prend en charge les anciens exécutables SOM de HP-UX et les ports μcLinux (non mmu) prennent en charge leur propre format FLAT.

Linux a aussi binfmt_misc , qui permet à l'espace utilisateur d'enregistrer des gestionnaires pour des formats binaires arbitraires. Certaines distributions en profitent pour pouvoir exécuter des applications Windows, .NET ou Java ; il s'agit toujours de lancer un interpréteur, mais c'est complètement transparent pour l'utilisateur.

Linux sur Alpha prend en charge le chargement des binaires Intel, qui sont exécutés via le em86 émulateur.

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

En théorie, on pourrait créer un nouveau format -- peut-être enregistrer une nouvelle "architecture" dans ELF -- pour les gros binaires. Puis le noyau binfmt loader devrait être informé de ce nouveau format, et vous ne voudriez pas manquer le ld-linux.so l'éditeur de liens dynamique et l'ensemble de la chaîne d'outils de construction. Il y a eu peu d'intérêt pour une telle fonctionnalité, et autant que je sache, personne ne travaille sur quelque chose comme ça.


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

  1. différents arcs de processeur utilisent un jeu d'instructions différent.
  2. la même architecture cpu peut utiliser différentes ABI, ABI définit comment utiliser le fichier de registre, comment appeler/retourner une routine. Différents ABI ne peuvent pas fonctionner ensemble.
  3. Même sur la même arch, même ABI, cela ne signifie toujours pas que nous pouvons copier un fichier binaire d'une distribution à une autre. Étant donné que la plupart des fichiers binaires ne sont pas liés de manière statique, ils dépendent donc des bibliothèques sous la distribution, ce qui signifie que différentes distributions peuvent utiliser différentes versions ou différentes configurations de compilation des bibliothèques.

Donc, si vous voulez que votre programme s'exécute sur toutes les distributions, vous devrez peut-être lier statiquement une version qui dépend uniquement de l'appel système du noyau, même si vous ne pouvez exécuter qu'une architecture spécifiée.

Si vous voulez vraiment exécuter un programme sur n'importe quelle arch, vous devez compiler des binaires pour toutes les arches et utiliser un script shell pour démarrer la bonne.


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


Linux
  1. Différence entre le programme de démarrage Systemd et Terminal ?

  2. La différence entre /opt et /usr/local ?

  3. La différence entre ~/.profile, ~/.bashrc, ~/.bash_profile, ~/.gnomerc, /etc/bash_bashrc, /etc/screenrc … ?

  4. différence entre le fichier de périphérique et le pilote de périphérique

  5. Existe-t-il une méthode pour exécuter perf sous WSL?

Exécuter des fichiers binaires sous Linux

Transférer des fichiers entre n'importe quel appareil à l'aide de Piping Server

Existe-t-il un équivalent à wine pour exécuter des applications Mac ?

Différence d'espace entre deux fichiers sous Linux

Est-il possible de partager des fichiers entre 2 OS différents sur le même ordinateur ?

Quelle est la différence entre /tmp et /run ?