GNU/Linux >> LINUX-Kenntnisse >  >> Linux

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

Alle Linux-Portierungen (d. h. der Linux-Kernel auf verschiedenen Prozessoren) verwenden ELF als Dateiformat für ausführbare Dateien und Bibliotheken. Eine bestimmte ELF-Binärdatei ist mit einer einzelnen Architektur/einem einzelnen Betriebssystem gekennzeichnet, auf dem sie ausgeführt werden kann (obwohl einige Betriebssysteme kompatibel sind, um ELF-Binärdateien von anderen Betriebssystemen auszuführen).

Die meisten Portierungen unterstützen das ältere a.out-Format. (Einige Prozessoren sind neu genug, dass es für sie noch nie ausführbare a.out-Dateien gegeben hat.)

Einige Ports unterstützen auch andere ausführbare Dateiformate; Beispielsweise unterstützt der PA-RISC-Port die alten ausführbaren SOM-Dateien von HP-UX, und die μcLinux-Ports (nicht mmu) unterstützen ihr eigenes FLAT-Format.

Linux hat auch binfmt_misc , die es Userspace ermöglicht, Handler für beliebige Binärformate zu registrieren. Einige Distributionen nutzen dies aus, um Windows-, .NET- oder Java-Anwendungen ausführen zu können – es startet wirklich immer noch einen Interpreter, aber es ist für den Benutzer völlig transparent.

Linux on Alpha unterstützt das Laden von Intel-Binärdateien, die über em86 ausgeführt werden Emulator.

Es ist möglich binfmt_misc zu registrieren für ausführbare Dateien anderer Architekturen, die mit qemu-user ausgeführt werden.

Theoretisch könnte man ein neues Format erstellen – vielleicht eine neue „Architektur“ in ELF registrieren – für fette Binärdateien. Dann der Kernel binfmt Loader müsste dieses neue Format gelehrt werden, und Sie möchten die ld-linux.so nicht verpassen dynamischer Linker und die gesamte Build-Toolchain. Es gab wenig Interesse an einer solchen Funktion, und soweit ich weiß, arbeitet niemand an so etwas.


Alle Linux-Distributionen verwenden dasselbe Binärformat ELF, aber es gibt dennoch einige Unterschiede:

  1. unterschiedliche CPU-Architekturen verwenden unterschiedliche Befehlssätze.
  2. derselbe CPU-Bogen kann unterschiedliche ABI verwenden, ABI definiert, wie die Registerdatei verwendet wird, wie eine Routine aufgerufen/zurückgegeben wird. Verschiedene ABI können nicht zusammenarbeiten.
  3. Sogar auf demselben Arch, derselben ABI bedeutet dies immer noch nicht, dass wir eine Binärdatei in einer Distribution in eine andere kopieren können. Da die meisten Binärdateien nicht statisch gelinkt sind, hängen sie von den Bibliotheken unter der Distribution ab, was bedeutet, dass unterschiedliche Distributionen unterschiedliche Versionen oder unterschiedliche Kompilierungskonfigurationen von Bibliotheken verwenden können.

Wenn Sie also möchten, dass Ihr Programm auf allen Distributionen läuft, müssen Sie möglicherweise eine Version statisch linken, die nur vom Syscall des Kernels abhängt, selbst diese können Sie nur auf einem bestimmten Arch ausführen.

Wenn Sie wirklich ein Programm auf irgendeiner Architektur ausführen wollen, dann müssen Sie Binärdateien für alle Architekturen kompilieren und ein Shell-Skript verwenden, um die richtige zu starten.


Fast alle Linux-Programmdateien verwenden den ELF-Standard.


Linux
  1. Unterschied zwischen Systemd und Terminal-Startprogramm?

  2. Der Unterschied zwischen /opt und /usr/local?

  3. Der Unterschied zwischen ~/.profile, ~/.bashrc, ~/.bash_profile, ~/.gnomerc, /etc/bash_bashrc, /etc/screenrc …?

  4. Linux – Wird eine ausführbare Linux-Datei, die auf einer „Variante“ von Linux kompiliert wurde, auf einer anderen laufen?

  5. Unterschied zwischen Gerätedatei und Gerätetreiber

Binärdateien unter Linux ausführen

Übertragen Sie Dateien zwischen beliebigen Geräten mit Piping Server

Gibt es ein Äquivalent zu wine zum Ausführen von Mac-Anwendungen?

Unterschied in Leerzeichen zwischen zwei Dateien unter Linux

Gibt es einen Unterschied zwischen einem Daemon und einem Dienst?

Ist es möglich, Dateien zwischen 2 verschiedenen Betriebssystemen auf demselben Computer zu teilen?