Ausführbar - Executable

Ein Hex-Dump eines ausführbaren Real-Mode- Loaders

In der Berechnung , ausführbaren Code , eine ausführbare Datei oder ein ausführbares Programm , manchmal einfach als genannte ausführbare oder binäre , verursacht einen Computer „angegebenen Aufgaben entsprechend codierten Anweisungen “, im Gegensatz zu einer Datendatei , die interpretiert werden müssen ( parsed ) durch ein Programm sinnvoll sein.

Die genaue Auslegung hängt von der Verwendung ab. "Anweisungen" werden traditionell als Maschinencode- Anweisungen für eine physische CPU verstanden . In manchen Kontexten kann auch eine Datei mit Skriptanweisungen (wie Bytecode ) als ausführbar angesehen werden.

Generierung ausführbarer Dateien

Ausführbare Dateien können in Maschinensprache von Hand codiert werden, obwohl es weitaus bequemer ist, Software als Quellcode in einer für Menschen leicht verständlichen Hochsprache zu entwickeln . In einigen Fällen kann der Quellcode stattdessen in Assemblersprache angegeben werden, die für Menschen lesbar bleibt, während sie eng mit Maschinencode-Anweisungen verbunden ist.

Die High-Level - Sprache kompiliert entweder in einer ausführbaren Maschinencode - Datei oder einer nicht ausführbaren Maschinencode - Objektdatei von einer Art; der äquivalente Prozess für den Quellcode der Assemblersprache wird Assemblierung genannt . Mehrere Objektdateien werden verknüpft , um die ausführbare Datei zu erstellen. Objektdateien - ausführbar oder nicht - werden in der Regel in einem gespeicherten Container - Format , wie Executable and Linking Format (ELF) oder Portable Executable (PE), das Betriebssystem -spezifische. Dadurch wird der generierte Maschinencode strukturiert, indem er beispielsweise in Abschnitte wie .text (ausführbarer Code), .data (initialisierte globale und statische Variablen) und .rodata (schreibgeschützte Daten wie Konstanten und Strings) unterteilt wird.

Ausführbare Dateien enthalten normalerweise auch ein Laufzeitsystem , das Laufzeitsprachfunktionen (wie Aufgabenplanung , Ausnahmebehandlung , Aufrufen von statischen Konstruktoren und Destruktoren usw.) und Interaktionen mit dem Betriebssystem implementiert, insbesondere die Übergabe von Argumenten, die Umgebung und das Zurückgeben eines Exit-Status , zusammen mit anderen Funktionen zum Starten und Herunterfahren, wie z. B. das Freigeben von Ressourcen wie Datei-Handles . Für C geschieht dies durch Einbinden des crt0- Objekts, das den eigentlichen Einstiegspunkt enthält und das Setup und Shutdown durch Aufrufen der Laufzeitbibliothek durchführt .

Ausführbare Dateien enthalten daher normalerweise erheblichen zusätzlichen Maschinencode, der über den direkt aus dem spezifischen Quellcode hinaus erzeugten hinausgeht. In manchen Fällen ist es wünschenswert, dies wegzulassen, zum Beispiel für die Entwicklung von eingebetteten Systemen, oder einfach zu verstehen, wie Kompilieren, Linken und Laden funktionieren. In C kann dies dadurch erfolgen, dass die übliche Laufzeit weggelassen wird und stattdessen explizit ein Linker-Skript angegeben wird, das den Einstiegspunkt generiert und das Hoch- und Herunterfahren abwickelt, beispielsweise den Aufruf mainvon start und am Ende den Exit-Status an den Kernel zurückgibt.

Ausführung

Um vom System (z. B. einem Betriebssystem, einer Firmware oder einem Bootloader ) ausgeführt zu werden, muss eine ausführbare Datei der Anwendungsbinärschnittstelle (ABI) des Systems entsprechen . Bei einfachen Schnittstellen wird eine Datei ausgeführt, indem sie in den Speicher geladen wird, an den Anfang des Adressraums gesprungen und von dort ausgeführt wird. In komplizierteren Schnittstellen verfügen ausführbare Dateien über zusätzliche Metadaten, die einen separaten Einstiegspunkt angeben . In ELF wird der Einstiegspunkt beispielsweise im Header- e_entryFeld angegeben, das die (virtuelle) Speicheradresse angibt, an der die Ausführung gestartet werden soll. In der GCC ( GNU Compiler Collection ) wird dieses Feld vom Linker anhand des _startSymbols gesetzt.

Siehe auch

Verweise

Externe Links