Warum wird für ausführbare Dateien eine Binärformatspezifikation benötigt?

541
Ravi Kumar

Ich verstehe, dass ein Betriebssystem wie Linux oder Windows in C / C ++ geschrieben und zu einer bestimmten Architektur (zum Beispiel AMD64) kompiliert wurde, um einen Maschinencode zu erzeugen, der für diese Architektur geeignet ist.

Meine Fragen -

  1. Warum ist eine separate Spezifikation für den Binärcode erforderlich - Linux verwendet ELF und Windows das Portable Executable Format?
  2. Können ein Betriebssystem und ein Programm, das auf diesem Betriebssystem ausgeführt wird, ohne diese Binärformatspezifikation erstellt werden?
  3. Ist das Binärformat: Architektur abhängig, Betriebssystem abhängig oder beides?
  4. Ist das Binärformat nur für ausführbare Dateien oder auch für den Betriebssystemcode anwendbar?
0

2 Antworten auf die Frage

3
xenoid

Das Format wird hauptsächlich verwendet, um Programme in den Speicher zu laden, was von einem Loader ausgeführt wird .

  1. Warum ist eine separate Spezifikation für den Binärcode erforderlich - Linux verwendet ELF und Windows das Portable Execution Format?

Höfliche Antwort: Weil das Betriebssystem anders ist und unterschiedliche Anforderungen stellt. Unix-Personenantwort: weil Microsoft das (eckige) Rad neu erfinden möchte.

  1. Können ein Betriebssystem und ein Programm, das auf diesem Betriebssystem ausgeführt wird, ohne diese Binärformatspezifikation erstellt werden?

Ja, aber nur die ganz trivialen, ein ziemlich einfaches Betriebssystem, das triviale Programme ausführt, die nicht "umsiedeln" müssen und keinen externen Code benötigen.

  1. Ist die Architektur des binären Formats abhängig, abhängig vom Betriebssystem oder beides?

Keine, das ELF-Format wird bei vielen Betriebssystemen und Architekturen verwendet.

  1. Ist das Binärformat nur für ausführbare Dateien oder auch für den Betriebssystemcode anwendbar?

In Linux ist der startfähige Kernel möglicherweise nicht ELF, aber die Kernelmodule verwenden das ELF-Format.

"Unix-Personenantwort: weil Microsoft das (eckige) Rad neu erfinden möchte." Lustigerweise sollten Sie sagen, dass PE (NT 3.1, ~ 1993) älter ist als ELF (Linux, ~ 1995 Migration von a.out). In der modernen Welt liegt PE am nächsten an [COFF] (https://en.wikipedia.org/wiki/COFF), das zuvor auch von Unixes verwendet wurde. Bob vor 6 Jahren 1
Ja, und fast jeder wechselte zu ELF (außer Windows und macOS). xenoid vor 6 Jahren 0
Das ist in keiner Weise von MS das Rad neu zu erfinden. Die Entscheidung, nach der Veröffentlichung (nicht) in ein neues Format (*) zu wechseln, unterscheidet sich stark von der Erarbeitung eines neuen Formats, "nur um anders zu sein". Pedantisch? Ja, vermutlich. Aber Ihre Antwort ist nicht sehr objektiv, scherzhaft oder nicht. Bob vor 6 Jahren 2
3
Bob

Wie Sie vielleicht schon erraten haben, enthalten ausführbare Formate mehr als nur Maschinencode. Zum Beispiel können sie:

  • Geben Sie Metadaten für das Betriebssystem an, z. B. für welche Architektur die ausführbare Datei vorgesehen ist. Diese Metadaten umfassen den Header der Datei.
  • Geben Sie das Programm - Layout im Speicher. In modernen Betriebssystemen werden die meisten ausführbaren Dateien nicht in einem einzigen Block in den Speicher geladen - sie haben normalerweise viele separate Regionen / Abschnitte / Segmente . Einige dieser Segmente enthalten ausführbaren Code. Einige von ihnen enthalten unveränderliche Daten wie Textzeichenfolgen. Einige davon werden als beschreibbarer Speicher für die Programmheap (s) bezeichnet.

    Unterschiedliche Programme haben unterschiedliche Anforderungen (Anforderungen) für die Größe dieser Abschnitte. Dies ist alles in der Kopfzeile angegeben.

  • In einigen Formaten können Sie auch eine digitale Signatur einbetten, um zu überprüfen, woher die Binärdatei stammt.


  1. Warum ist eine separate Spezifikation für den Binärcode erforderlich - Linux verwendet ELF und Windows das Portable Executable Format?

Die Gründe sind in erster Linie historisch, und Betriebssysteme neigen dazu, bei ihrem vorhandenen 'nativen' (oder 'default') Format zu bleiben, es sei denn, es gibt einen zwingenden Grund für einen Wechsel (wie z. B. vom DOS-MZ-Format zu PE in NT 3.1 und von a .out an ELF in Linux 1.2 und von COFF an ELF in verschiedenen Unixen im Laufe der Jahre).

Es ist zu beachten, dass der zugrunde liegende Maschinencode von der CPU-Architektur abhängt, ansonsten (abgesehen von Systemaufrufen und verknüpften Bibliotheken) weitgehend zwischen Betriebssystemen portierbar ist. Tatsächlich können moderne Windows und Linux beide ausführbaren Formate ausführen: ELF-ausführbare Dateien werden unter Windows über WSL und PE-ausführbare unter Linux über WINE ausgeführt.

  1. Können ein Betriebssystem und ein Programm, das auf diesem Betriebssystem ausgeführt wird, ohne diese Binärformatspezifikation erstellt werden?

Wir gehen auf den Hauptzweck dieser Formate zurück. Die meisten modernen ausführbaren Dateien können nicht ausgeführt werden, wenn die Metadaten dem Betriebssystem nicht mitteilen, wo Teile des Programms geladen werden sollen. Einige sehr alte Formate wie COM enthalten ziemlich viel reinen Code, sind jedoch nicht besonders flexibel und haben sich in Ungnade gefallen.

In der Praxis besteht nicht einmal die Notwendigkeit eines Betriebssystems. Auf Hardwareebene wird das BIOS unter der Annahme eines (älteren) BIOS einfach an einer bestimmten Stelle auf der Festplatte (MBR) ausgeführt, wobei es sich um beliebigen Maschinencode handeln kann, der dann ein Betriebssystem übernimmt und entweder ein Betriebssystem startet oder irgendetwas tut sonst mag es. (Sie können den MBR selbst als Binärformat anzeigen, obwohl er nicht direkt mit dem ausführbaren Code zusammenhängt.) Die modernere UEFI gibt jedoch ein komplexeres ausführbares Format (PE) an.

  1. Ist die Architektur des binären Formats abhängig, abhängig vom Betriebssystem oder beides?

Hängt wirklich vom Format ab. Einige Formate setzen eine bestimmte Architektur voraus. Bei anderen können Sie die Architektur aus einer Liste mit angegebenen "magischen Zahlen" in der Kopfzeile auswählen. Wieder andere sind vollständig architekturunabhängig (z. B. Java und .NET / CIL-Bytecode).

In ähnlicher Weise erlegt das Format im Allgemeinen keine Einschränkung für das Betriebssystem auf, obwohl das Betriebssystem darauf beschränkt ist, in welchen Formaten es (nativ) erkannt und ausgeführt werden kann. Natürlich können Kompatibilitätsebenen auf dem Kernbetriebssystem andere Formate ausführen (z. B. JVM, .NET / CLR, WSL & WINE usw.), die das Kernbetriebssystem möglicherweise nicht erkennt.

  1. Ist das Binärformat nur für ausführbare Dateien oder auch für den Betriebssystemcode anwendbar?

Ein großer Teil der meisten modernen Betriebssysteme besteht nur aus einer Sammlung "normaler" ausführbarer Dateien. Einige Teile des Betriebssystems sind jedoch "speziell" und verwenden nicht unbedingt dasselbe Format wie der Rest. Normalerweise gilt dies nur für den Bootloader und den Kernel.

Ziehen einen bestimmten, sehr häufig, beispielsweise wird die Legacy - BIOS - Bootloader nicht in entweder den ELF oder PE - Formate, die von Linux und Windows. Der Linux-Kernel ist im Allgemeinen in einem von ELF abgeleiteten Format aufgebaut, das der GRUB-Bootloader laden kann, er kann jedoch in einem anderen Format vorliegen, um mit dem verwendeten Bootloader kompatibel zu sein. Der Linux-Kernel unterstützt auch einen EFI-Stub- Modus, der einen minimalen PE / COFF-Header enthält, um mit dem direkten UEFI-Boot kompatibel zu sein.