Beste Antwort
Tragbare ausführbare Datei
Das Portable Executable-Format ist ein Dateiformat für ausführbare Dateien, Objektcode, DLLs, FON-Schriftdateien und andere, die in 32-Bit- und 64-Bit-Versionen von Windows-Betriebssystemen verwendet werden. Das PE-Format ist eine Datenstruktur, die die Informationen enthält, die der Windows-Betriebssystemlader zum Verwalten des umschlossenen ausführbaren Codes benötigt.
Dies umfasst dynamische Bibliotheksreferenzen für Verknüpfungen, API-Export- und -Importtabellen, Ressourcenverwaltungsdaten und Thread -Lokale Speicherdaten (TLS). Unter NT-Betriebssystemen wird das PE-Format für EXE, DLL, SYS (Gerätetreiber) und andere Dateitypen verwendet. Die EFI-Spezifikation (Extensible Firmware Interface) besagt, dass PE das standardmäßige ausführbare Format in EFI-Umgebungen ist.
Antwort
Portabilität von C-Quellcode bedeutet, dass, solange Ihre gewünschte Zielplattform Wenn ein funktionierender C-Compiler verfügbar ist, können Sie Ihren C-Quellcode auf diese Zielplattform verschieben, indem Sie ihn neu kompilieren, ohne ihn ändern zu müssen. Da für fast jede Zielplattform ein C-Compiler verfügbar ist, wird C als sehr portable Programmiersprache angesehen.
Das einfache Schreiben von Code in C führt jedoch zu Keine Garantie für Portabilität. Sie müssen Disziplin üben, um zu vermeiden, dass Code geschrieben wird, der nicht portierbar ist. Das Schreiben von Code, der eine der folgenden Aktionen ausführt, führt beispielsweise zu nicht portierbarem Code:
- Nimmt Annahmen über die Größe anderer Datentypen als char an.
- Macht Annahmen darüber, wie Daten im Speicher und innerhalb von Strukturen ausgerichtet sind.
- Macht Annahmen darüber, wie Daten innerhalb von Strukturen gepackt / aufgefüllt werden.
- Macht Annahmen über die Bytereihenfolge (Big Endian vs Little Endian)
- Verwendet eine nicht standardmäßige Compiler-Erweiterung, die möglicherweise nicht in allen Compiler-Implementierungen verfügbar ist.
- Verwendet eine nicht standardmäßige Bibliothekserweiterung, die möglicherweise nicht auf allen Plattformen verfügbar ist.
- Stützt sich auf ein implementierungsdefiniertes Verhalten, das in einer anderen Compiler-Implementierung möglicherweise anders funktioniert.
- Enthält ein undefiniertes Verhalten, das scheint in einer Umgebung zu funktionieren, kann sich jedoch in einer anderen Umgebung unvorhersehbar verhalten.
- Führt alle API-Aufrufe (Application Programming Interface) für den Betrieb aus System, das möglicherweise nicht in allen Umgebungen verfügbar ist.
- Nimmt Annahmen über bestimmte Speicheradressen an (z. B. dass eine bestimmte Speicheradresse einem Hardware-Geräteregister usw. zugeordnet ist).
- Nimmt Annahmen über die Größe eines Zeigers an oder dass ein Zeiger dieselbe Größe wie ein int hat.
- Nimmt Annahmen darüber vor, wie Argumente übergeben werden (auf dem Stapel oder in bestimmten Registern).
- Enthält Quellcode für Inline-Assemblersprachen.
- Verwendet eine neueste und beste Funktion der C-Sprache, die von einigen Compiler-Implementierungen möglicherweise noch nicht unterstützt wird (und in einigen Fällen möglicherweise nie unterstützt wird) unterstützt).
- Verlässt sich auf eine Bibliothek, die eine der oben genannten Aufgaben ausführt.
Dies ist keine vollständige Liste.
Wenn Sie können Um die Verwendung von nicht portierbarem Code zu vermeiden, ist es am besten, diesen nicht portablen Code in einer separaten Quelldatei zu isolieren. Wenn Sie dann den Code auf eine neue Zielplattform verschieben müssen, ist klar, welche Teilmenge des Quellcodes geändert werden muss.