Executable and Linking Format — Änderungen 5069 → 6598

Zeile 82: Zeile 82:
  
 
===== EI_CLASS =====
 
===== EI_CLASS =====
−
Die Klasse gibt unter anderen an, wie viel Bits zur Adressierung verwendet werden. Also eine 32Bit-Maschine sollte überprüfen, ob der Code auch wirklich auf 32Bit-Maschinen geht.
+
Die Klasse gibt unter anderen an, wie viel Bits zur Adressierung verwendet werden. Also eine 32-Bit-Maschine sollte überprüfen, ob der Code auch wirklich auf 32-Bit-Maschinen geht.
 
{| {{Prettytable}}
 
{| {{Prettytable}}
 
! Name        || Wert  || Beschreibung
 
! Name        || Wert  || Beschreibung
Zeile 88: Zeile 88:
 
| ELFCLASSNONE || 0    || Ungültige Klasse
 
| ELFCLASSNONE || 0    || Ungültige Klasse
 
|-
 
|-
−
| ELFCLASS32  || 1    || 32bit-Objekte
+
| ELFCLASS32  || 1    || 32-Bit-Objekte
 
|-
 
|-
−
| ELFCLASS64  || 2    || 64bit-Objekte
+
| ELFCLASS64  || 2    || 64-Bit-Objekte
 
|}
 
|}
  
 
===== EI_DATA =====
 
===== EI_DATA =====
−
Das Byte e_ident[EI_DATA] gibt an, in welchen Format Daten gespeichert werden, Little-Endian oder Big-Endian
+
Das Byte e_ident[EI_DATA] gibt an, in welchen Format Daten gespeichert werden, Little-Endian oder Big-Endian.
  
 
{| {{Prettytable}}
 
{| {{Prettytable}}
Zeile 107: Zeile 107:
  
 
===== EI_VERSION =====
 
===== EI_VERSION =====
−
Hier sollte das gleiche wie in e_version drinstehen, also EV_CURRENT
+
Hier sollte das gleiche wie in e_version drinstehen, also EV_CURRENT.
  
 
===== EI_PAD =====
 
===== EI_PAD =====
−
Alle Bytes in e_ident ab EI_PAD (inklusive) werden nicht benutzt und sollten Null gesetzt sein.
+
Alle Bytes in e_ident ab EI_PAD (inklusive) werden nicht benutzt und sollten auf Null gesetzt sein.
  
 
===== Architektur-Identifikation =====
 
===== Architektur-Identifikation =====
−
Für einen 32bit Intel-Prozessor sollten folgende Felder folgende Werte haben:
+
Für einen [[x86]]-Prozessor sollten folgende Felder folgende Werte haben:
 
{| {{Prettytable}}
 
{| {{Prettytable}}
 
! Feld              || Wert
 
! Feld              || Wert
Zeile 139: Zeile 139:
 
| ET_CORE  || 4      || Kerndatei
 
| ET_CORE  || 4      || Kerndatei
 
|-
 
|-
−
| ET_LOPROC || 0xff00 || Prozessor-spezifisch
+
| ET_LOPROC || 0xff00 || Prozessorspezifisch
 
|-
 
|-
−
| ET_HIPROC || 0x00ff || Prozessor-spezifisch
+
| ET_HIPROC || 0x00ff || Prozessorspezifisch
 
|}
 
|}
−
Für eine ausführbare ELF-Datei, müsste hier ET_EXEC stehen.
+
Für eine ausführbare ELF-Datei müsste hier ET_EXEC stehen.
  
 
==== e_machine ====
 
==== e_machine ====
−
Wie oben schonmal erwähnt, steht hier der Prozessor-Typ drin.
+
Wie oben bereits erwähnt, enthält dieses Element den Prozessor-Typ.
 
{| {{Prettytable}}
 
{| {{Prettytable}}
 
! Name    || Wert || Beschreibung
 
! Name    || Wert || Beschreibung
Zeile 168: Zeile 168:
  
 
==== e_version ====
 
==== e_version ====
−
Beschreibt die Aktuelle ELF-Version
+
Beschreibt die ELF-Version der Datei.
 
{| {{Prettytable}}
 
{| {{Prettytable}}
 
! Name      || Wert || Beschreibung
 
! Name      || Wert || Beschreibung
Zeile 187: Zeile 187:
  
 
==== e_flags ====
 
==== e_flags ====
−
Dieses Feld enthält Prozessorspezifische Flags.
+
Dieses Feld enthält prozessorspezifische Flags.
  
 
==== e_ehsize ====
 
==== e_ehsize ====
Zeile 208: Zeile 208:
  
 
=== Programm-Header ===
 
=== Programm-Header ===
−
Der Programm-Header besteht aus e_phnum Einträgen, wobei jeder e_phentsize groß ist. Der Programm-Header ist also insgesamt e_phnum*e_phentsize Bytes groß. Im Programm-Header stehen z.B der Text- oder Daten-Teil eines Programms.
+
Der Programm-Header besteht aus e_phnum Einträgen, wobei jeder e_phentsize groß ist. Der Programm-Header ist also insgesamt e_phnum*e_phentsize Bytes groß. Im Programm-Header stehen z. B. der Text- oder Daten-Teil eines Programms.
 
Ein Eintrag im Programm-Header ist wie folgt aufgebaut:
 
Ein Eintrag im Programm-Header ist wie folgt aufgebaut:
 
{| {{Prettytable}}
 
{| {{Prettytable}}
Zeile 219: Zeile 219:
 
| [[#p_vaddr | p_vaddr]]  || 0x08  || 4    || Virtuelle Adresse, an die das Segment kopiert werden soll
 
| [[#p_vaddr | p_vaddr]]  || 0x08  || 4    || Virtuelle Adresse, an die das Segment kopiert werden soll
 
|-
 
|-
−
| [[#p_paddr | p_paddr]]  || 0x0C  || 4    || Physikalische Adresse (unrelevant)
+
| [[#p_paddr | p_paddr]]  || 0x0C  || 4    || Physische Adresse (meist irrelevant)
 
|-
 
|-
 
| [[#p_filesz | p_filesz]] || 0x10  || 4    || Größe des Segments in der Datei
 
| [[#p_filesz | p_filesz]] || 0x10  || 4    || Größe des Segments in der Datei
Zeile 243: Zeile 243:
 
| PT_DYNAMIC || 2          || Dynamisches Segment
 
| PT_DYNAMIC || 2          || Dynamisches Segment
 
|-
 
|-
−
| PT_INTERP  || 3          || Position eines 0-Terminierten Strings, der den Interpreter angibt.
+
| PT_INTERP  || 3          || Position eines 0-terminierten Strings, der den Interpreter angibt.
 
|-
 
|-
 
| PT_NOTE    || 4          || Universelles Segment
 
| PT_NOTE    || 4          || Universelles Segment
Zeile 253: Zeile 253:
 
| PT_TLS    || 7          || Thread-Local Storage
 
| PT_TLS    || 7          || Thread-Local Storage
 
|- bgcolor='#bbb'
 
|- bgcolor='#bbb'
−
| PT_LOOS    || 0x60000000 || rowspan='2' | Reserviert für Betriebssystem spezifische Erweiterungen
+
| PT_LOOS    || 0x60000000 || rowspan='2' | Reserviert für betriebssystemspezifische Erweiterungen
 
|- bgcolor='#bbb'
 
|- bgcolor='#bbb'
 
| PT_HIOS    || 0x6fffffff
 
| PT_HIOS    || 0x6fffffff
 
|- bgcolor='#bbb'
 
|- bgcolor='#bbb'
−
| PT_LOPROC  || 0x70000000 || rowspan='2' | Reserviert für Prozessor spezifische Erweiterungen
+
| PT_LOPROC  || 0x70000000 || rowspan='2' | Reserviert für prozessorspezifische Erweiterungen
 
|- bgcolor='#bbb'
 
|- bgcolor='#bbb'
 
| PT_HIPROC  || 0x7fffffff
 
| PT_HIPROC  || 0x7fffffff
 
|}
 
|}
  
−
Außerdem habe ich noch diese (anscheinend inoffiziellen) Werte in Linux-Header-Dateien (http://www.cs.fsu.edu/~baker/devices/lxr/http/source/linux/include/linux/elf.h#L35) gefunden.
+
Außerdem habe ich noch diese (betriebssystemspezifischen) Werte in Linux-Header-Dateien (http://www.cs.fsu.edu/~baker/devices/lxr/http/source/linux/include/linux/elf.h#L35) gefunden.
 
{| {{Prettytable}}
 
{| {{Prettytable}}
 
! Name            || Wert
 
! Name            || Wert
 
|-
 
|-
−
| PT_GNU_EH_FRAME || 0x6474e550
+
| PT_GNU_EH_FRAME || PT_LOOS+0x474e550
 
|-
 
|-
 
| PT_GNU_STACK    || PT_LOOS+0x474e551
 
| PT_GNU_STACK    || PT_LOOS+0x474e551
Zeile 278: Zeile 278:
  
 
==== p_paddr ====
 
==== p_paddr ====
−
Gibt die physikalische Zieladresse an, für Systeme, für welche dies relevant ist.
+
Gibt die physische Zieladresse für Systeme an, für welche dies relevant ist.
  
 
==== p_filesz ====
 
==== p_filesz ====
−
Gibt die Größe des Segments in der Datei wieder. Kann eventuell auch 0 sein, z.B für die BSS-Sektion
+
Enthält die Größe des Segments in der Datei. Kann eventuell auch 0 sein, z. B. für die BSS-Sektion.
  
 
==== p_memsz ====
 
==== p_memsz ====
Zeile 287: Zeile 287:
  
 
==== p_flags ====
 
==== p_flags ====
−
Beschreibt Flags, z.B Zugriffsrechte.
+
Beschreibt Flags, z. B. Zugriffsrechte.
 
{| {{Prettytable}}
 
{| {{Prettytable}}
 
! Name || Wert || Beschreibung
 
! Name || Wert || Beschreibung
Zeile 303: Zeile 303:
  
 
==== p_align ====
 
==== p_align ====
−
Alignment des Segmentes. Wenn 0 oder 1 angegeben wird, ist kein Alignment erforderlich. Ansonsten muss es eine 2er Potenz sein (2, 4, 8, 16, ...).
+
Alignment des Segmentes. Wenn 0 oder 1 angegeben wird, ist kein Alignment erforderlich. Ansonsten muss es eine 2er-Potenz sein (2, 4, 8, 16, ...).
  
 
== Überprüfen ==
 
== Überprüfen ==
Zeile 313: Zeile 313:
 
* Version überprüfen
 
* Version überprüfen
  
−
= Siehe auch =
+
== Siehe auch ==
 
[[ELF Tutorial]]
 
[[ELF Tutorial]]
−
= Links =
+
== Links ==
 
* [http://www.acm.uiuc.edu/sigops/rsrc/pfmt11.pdf ELF für x86]
 
* [http://www.acm.uiuc.edu/sigops/rsrc/pfmt11.pdf ELF für x86]
 
* [http://en.wikipedia.org/wiki/Executable_and_Linkable_Format wikipedia: ELF] (sehr gute Sammlung von Links)
 
* [http://en.wikipedia.org/wiki/Executable_and_Linkable_Format wikipedia: ELF] (sehr gute Sammlung von Links)
  
 
[[Kategorie:Dateityp]]
 
[[Kategorie:Dateityp]]