| Zeile 82: | Zeile 82: | ||
===== EI_CLASS ===== | ===== EI_CLASS ===== | ||
| − | Die Klasse gibt unter anderen an, wie viel Bits zur Adressierung verwendet werden. Also eine | + | 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 || | + | | ELFCLASS32 || 1 || 32-Bit-Objekte |
|- | |- | ||
| − | | ELFCLASS64 || 2 || | + | | 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 | + | 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 || | + | | ET_LOPROC || 0xff00 || Prozessorspezifisch |
|- | |- | ||
| − | | ET_HIPROC || 0x00ff || | + | | ET_HIPROC || 0x00ff || Prozessorspezifisch |
|} | |} | ||
| − | Für eine ausführbare ELF-Datei | + | Für eine ausführbare ELF-Datei müsste hier ET_EXEC stehen. |
==== e_machine ==== | ==== e_machine ==== | ||
| − | Wie oben | + | 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 | + | 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 | + | 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 || | + | | [[#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- | + | | 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 | + | | 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 | + | | 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 ( | + | 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 || | + | | 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 | + | Gibt die physische Zieladresse für Systeme an, für welche dies relevant ist. |
==== p_filesz ==== | ==== p_filesz ==== | ||
| − | + | 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]] | ||