Microsoft Portable Executable and Common Object File Format

Aus Lowlevel
Version vom 9. Dezember 2008, 18:18 Uhr von Be59 (Diskussion | Beiträge) (→‎Informationen zum optimalen Header)
Wechseln zu:Navigation,

Grober Aufbau

MS-DOS Header

Diese Header ist ein Kompabilitätsheader, womit im MS-DOS ausgedrückt werden kann, dass das Programm darunter nicht läuft.
Für lowlevel kann dieser Bereich getrost ausgelassen werden, weil

  • Programme eines Nicht-Windowssystem brauchen nicht unter MS-DOS zu laufen
  • Fast niemand hat noch MS-DOS

PE Kennzeichnung

An der Stelle 0x3c kommt das Kennzeichnen des PE-Formates. Dieser ist 4-Byte groß und sieht so aus: "PE\0\0". (Zwei Nullbytes am Ende) Das ist wiederum ein Kennzeichen von Windows und sollte verändert(nicht weggelassen) werden.

COFF Dateiheader

Hier ist der Common Object File Format Header:

Offset Größe Beschreibung
0x00h 2 Bytes Hier wird beschrieben, für welche Plattform diese aufführbare Datei geeignet ist.
0x02h 2 Bytes Die Anzahl der Sections.
0x04h 4 Bytes Die ersten 32-Bytes von der Sekundenanzahl ab 1.Januar 1970 00:00, wann die Datei hergestellt wurde.
0x08h 4 Bytes Die Dateioffset dieser COFF-Datei. Wenn Null, dann ist garkeine vorhanden.
0x0Bh 4 Bytes Die Anzahl der Eintragungen von der Symboltabelle.(?)
0x0Fh 2 Bytes Größe des optimalen Headers der ausführbaren Datei. Achtung, ist nicht für die Objektdatei
0x12h 2 Bytes Flags für Eigenschaften der Datei.

Weitergehende Informationen

Plattformtypen für den COFF-Header

In dieser Tabelle werden die Werte für die Plattformentypen des COFF-Headers erläutert.

Wert Plattform
0x00h Nicht bekannt oder auf jeder Plattform lauffähig.
0x1D3h Matsushita AM33
0x8664h x64
0x1C0h ARM little endian
0xEBCh EFI Bytecode
0x14Ch x86 kompatible Prozessoren
0x200h Intel Itanium Prozessorfamilie
0x9041h Mitsubishi M32R little endian
0x266h MIPS16
0x366h MIPS mit FPU
0x466h MIPS16 mit FPU
0x1f0h Power PC little endian
0xf1h Power PC mit Floating Point Support
0x166h MIPS little endian
0x1A2h Hitachi SH3
0x1A3h Hitachi SH3 DSP
0x1A6h Hitachi SH4
0x1A8h Hitachi SH5
0x1C2h Thumb
0x169h MIPS little endian WCE v2

Flags des COFF-Headers

Bit Funktion
1 Nur für Windows wichtig.
2 Muss Eins sein. Wenn nicht, dann hat der Linker ein Fehler.
3 Obsulot. Sollte Null sein.
4 Obsulot. Sollte Null sein.
5 Obsulot. Sollte Null sein.
6 Das Programm kann mit mehr als 2GB was anfangen. In naher Zukunft wird es obsulot sein.
7 Reserviert.
8 Obsulot. Sollte Null sein.
9 Plattform bassiert auf 32-Bit-Ausdrücke.
10 Debuginformationen wurden entfernt.
11 Diese Datei wurde irgendwie vom Internet oder von einen Wechselmedium kopiert.
12 Diese Datei ist eine Systemdatei und keine Userprogramm
13 Diese Datei ist eine DLL.
14 Diese Datei sollte auf einen Einprozessor System laufen.
15 Obsulot. Sollte Null sein.

Informationen zum optimalen Header

Jede ausführbare Datei hat ein optimalen Header. Hier wird er (für Windows) benötigt. In Objektdateien wird dieser normalerweiße nicht verwendet, ausser seine Größe zu erhöhen. Der optimale Header wird in drei Abschnitte unterteilt. (Zu PE32 und PE32+ siehe unten)

Offset PE32/PE32+ Größe Beschreibung
0 28/24 Zeigt algemeine Informationen an.
28/24 68/88 Windows spezifische Informationen.
96/112 Variabel Sind Adressen oder Teile von Tabellen, die für das Betriebsystem wichtig sind.

Der erste Abschnitt wird wieder in folgende unterteilt:

Offset Größe Beschreibung
0 2 Bytes Hier wird angegeben, ob es sich um PE32(0x10Bh) oder PE32+(0x20Bh) handelt. Bei PE32+ wird ein 64-Bit-Namesraum verwendet. Unter Windows gibt es trotzdem eine Beschränkung auf 2 GigaByte. Möglich ist es auch, die Datei als ROM Image( 0x107h) zu kennzeichen, aber es geht nicht hervor, was die Unterschiede sind.
2 1 Byte Hauptversion des Linkers
3 1 Byte Nebenversion des Linkers
4 4 Bytes Hier soll die Größe des Quellcodes hin
8 4 Bytes Die Summe aller initialisierten Datensektionen.
12 4 Bytes Die Summe aller nicht initialisierten Datensektionen.(BSS)
16 4 Bytes Unmissverständlich. Bitte übersetzen: The address of the entry point relative to the image base when the executable file is loaded into memory. For program images, this is the starting address. For device drivers, this is the address of the initialization function. An entry point is optional for DLLs. When no entry point is present, this field must be zero 20 4 Bytes Die Adresse, die relativ zum ersten Sektor der ausführbaren Datei steht.

Links