Gibt es einen Unterschied zwischen ausführbaren Binärdateien zwischen Distributionen?

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

  •  06-07-2019
  •  | 
  •  

Frage

Da alle Linux-Distributionen den gleichen Kernel verwenden, gibt es einen Unterschied zwischen ihren ausführbaren Binärdateien?

Wenn ja, was sind die wichtigsten Unterschiede? Oder bedeutet, dass wir eine universelle Linux ausführbare Datei erstellen können?

War es hilfreich?

Lösung

Alle Linux-Distributionen verwenden das gleiche Binärformat ELF, aber es gibt immer noch einige Unterschiede:

  1. verschiedener CPU-Bogen verwendet unterschiedlicher Befehlssatz.
  2. die gleiche CPU-Bogen können verschiedene ABI verwenden, definiert ABI, wie die Registerdatei verwenden, wie eine Routine aufzurufen / zurückzukehren. Verschiedene ABI können nicht zusammenarbeiten.
  3. Auch auf demselben Bogen, gleiches ABI, das bedeutet noch nicht, dass wir eine Binärdatei in einer Verteilung auf einem anderen kopieren können. Da die meisten Binärdateien sind nicht statisch gelinkt, so hängt sie an den Bibliotheken unter der Verteilung, die unterschiedliche Verteilung bedeutet, verschiedene Versionen oder verschiedene Kompilierung Konfiguration von Bibliotheken verwenden.

Also, wenn Sie Ihr Programm wollen auf allen Verteilung ausführen, können Sie statisch müssen eine Version verknüpfen, die nur auf den Kernel des syscall hängt, auch dies kann man nur einen bestimmten Bogen ausgeführt werden.

Wenn Sie wirklich ein Programm auf jedem Bogen ausgeführt werden sollen, dann müssen Sie Binärdateien kompilieren für alle Bögen, und einen Shell-Skript verwenden, um den richtigen zu starten.

Andere Tipps

Alle Ports Linux (das heißt, der Linux-Kernel auf verschiedenen Prozessoren) verwenden ELF als die Dateiformat für ausführbare Dateien und Bibliotheken. Eine spezifische ELF-Binary mit einer einzigen Architektur / OS markiert, auf denen sie ausgeführt werden kann (obwohl einige OSes Kompatibilität ELF-Binärdateien von anderen Betriebssystemen laufen müssen).

Die meisten Häfen haben Unterstützung für das ältere a.out Format. (Einige Prozessoren sind neu genug, dass es noch nie für sie keine a.out Executables existierte.)

Einige Ports unterstützen andere ausführbare Dateiformate als auch, zum Beispiel, hat die PA-RISC-Port-Unterstützung für HP-UX alten SOM Executables und die μcLinux (nonmmu) Ports unterstützt ihr eigenes FLAT-Format.

Linux hat auch binfmt_misc , die User-Space-Handler für beliebige binäre registrieren erlaubt Formate. Einige Distributionen nutzen diese Lage sein, Windows .NET oder Java-Anwendungen auszuführen -. Es ist wirklich noch einen Dolmetscher starten, aber es ist völlig transparent für den Benutzer


Linux auf Alpha hat die Unterstützung für das Laden Intel-Binärdateien, die über den em86 Emulator ausgeführt werden.

Es ist möglich, binfmt_misc für ausführbare Dateien von anderen Architekturen zu registrieren, zu laufen mit qemu-user .

In der Theorie könnte man ein neues Format erstellen - registrieren vielleicht eine neue „Architektur“ in ELF - für Fett Binärdateien. Dann würde der Kernel binfmt loader über dieses neue Format wird gelehrt haben, und Sie würden nicht die ld-linux.so dynamischen Linker und den gesamten Build-Toolchain verpassen. Es gab wenig Interesse an einer solchen Funktion, und soweit ich weiß, niemand arbeitet an etwas Vergleichbares.

Fast alle Linux-Programmdateien verwenden, um den ELF Standard.

Old Unixes auch COFF -Format verwendet. Sie können immer noch ausführbare Dateien aus Zeiten der Vorzeit in diesem Format finden. Linux hat noch Unterstützung für sie (ich weiß nicht, ob es in der aktuellen Distributionen kompiliert, obwohl).

Wenn Sie ein Programm erstellen möchten, die eine alle Linux-Distributionen läuft, können Sie prüfen, mit Skriptsprachen (wie Python und Perl) oder plattformunabhängigen Programmiersprache wie Java.

Programme in Skriptsprachen geschrieben werden, zur Ausführungszeit eingehalten werden, was bedeutet, dass sie immer die Plattform, die sie auf und ausgeführt werden kompiliert übereinstimmen, daher sollte immer funktionieren (vorausgesetzt, dass die Bibliotheken korrekt eingerichtet sind).

Programme in Java geschrieben, auf der anderen Seite, werden vor der Verteilung von ihnen zusammengestellt, kann aber so lange auf jedem Linux-Distribution ausgeführt werden, da es sich um eine Java VM installiert ist.

Darüber hinaus in Java geschriebenen Programme können auf anderen Betriebssystemen wie MS Windows und Mac OS ausgeführt werden.

Das gleiche gilt für viele Programme geschrieben in Python und Perl; jedoch, ob ein Python oder Perl Programm auf einem anderen Betriebssystem arbeiten wird, hängt ab, welche Bibliotheken von diesem Programm verwendet werden und ob diese Bibliotheken auf den anderen Betriebssystemen zur Verfügung stehen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top