Executable and Linkable Format

binární formát souboru v informatice

Executable and Linkable Format (zkratka ELF) je v informatice standardní souborový formát pro uložení spustitelných souborů, linkovatelných objektů, dynamických (sdílených) knihovenladících výpisů (core dumps). ELF formát je poměrně rozšířený, v současnosti ho využívají operační systémy jako Linux, Solaris, IRIX, FreeBSD, NetBSD, OpenBSD a další. ELF formát se také objevuje u konzolí (PlayStation 2, PlayStation PortablePlayStation 3). Formát byl původně vyvinut v Unix System Laboratories pro operační systém UNIX System V.

Základní schéma souborového formátu Executable and Linkable Format (ELF), používaného např. operačním systémem Linux.

Nasazení

editovat

ELF nahradil formáty spustitelných souborů jako jsou a.out, COFF, PE, Mach-O nebo COM. Podle mnohých uživatelů ELF překonává ostatní formáty proto, že jsou buď závislé na platformě nebo jsou méně rozšiřitelné. Mimo unixové systémy je ELF použit v operačním systému OpenVMS ve verzi pro Itanium procesor nebo v systému BeOS Revision 4, kde nahrazuje PE formát (Portable Executable) na starších x86 počítačích (PPC verze zůstala při formátu Preferred Executable Format a nikdy nepoužívala PE).

Popis formátu ELF

editovat

Soubor ELF vždy obsahuje hlavičku, která může být následována segmenty a sekcemi. Segmenty obsahují informace nutné pro běh programového kódu. Jsou mapovány operačním systémem UN*X do virtuálního adresového prostoru pomocí systémového volání mmap(2)[1]. Sekce obsahují informace pro linker (spojování) a relokaci (přepočet adresy) objektů, které jsou umístěny v operační paměti počítače.

Typy souborů

editovat
  • spustitelný soubor (ET_EXEC) – musí obsahovat segmenty[1]
  • objektový soubor (ET_REL, *.o) – musí obsahovat sekce, odkazuje na další objektové soubory[1]
  • dynamické knihovny (ET_DYN, *.so) – musí obsahovat segmenty i sekce, odkazuje na další objektové nebo spustitelné soubory[1]
  • soubor s výpisem ladících informací (ET_CORE) – neobsahuje segmenty ani sekce[1], generován při fatální chybě a selhání programu

Struktura

editovat
  • hlavička ELF – základní informace o typu souboru, umístění dalších částí ELF souboru
  • hlavička tabulky programů – popis dostupných segmentů
  • hlavička tabulky sekcí – popis dostupných sekcí
  • údaje odkazované položkami z hlavičky tabulky programů nebo sekcí

V případě unixového spustitelného souboru obsahuje každý segment několik sekcí. Platí, že každý bajt souboru je součástí nejvýše jedné sekce.

ELF hlavička

editovat
Atribut Význam
e_ident identifikace ELF (magic number), typ architektury, verze ABI,...[1]
e_type typ objektového souboru[1]
e_machine cílová architektura[1]
e_version verze objektového souboru[2]
e_entry virtuální adresa vstupního bodu programu[1]
e_phoff ukazatel na pozici tabulky programů v souboru[1]
e_shoff ukazatel na pozici tabulky sekcí v souboru[1]
e_flags procesorové příznaky[1]
e_ehsize velikost ELF hlavičky (v bajtech)[1]
e_phentsize velikost záznamu v tabulce programů (v bajtech)[1]
e_phnum počet záznamů v tabulce programů[1]
e_shentsize velikost záznamu v tabulce sekcí (v bajtech)[1]
e_shnum počet záznamů v tabulce sekcí[1]
e_shstrndx odkaz na tabulku řetězců[1]

Hlavička tabulky programů

editovat
Atribut Význam
p_type typ segmentu[1]
p_offset pozice 1. bajtu segmentu od počátku souboru[2]
p_vaddr virtuální adresa 1. bajtu segmentu v operační paměti[2]
p_paddr fyzická adresa uložení segmentu v operační paměti[1]
p_filesz délka segmentu v souboru (v bajtech)[2]
p_memsz velikost paměti pro daný segment (v bajtech)[2]
p_flags příznaky daného segmentu[2]
p_align zarovnání segmentu v operační paměti a v rámci souboru[2]
Typy segmentů
Atribut Hodnota Popis
PT_NULL 0 [nevyužito][1]
PT_LOAD 1 označuje segment, který bude nahrán do operační paměti[2]
PT_DYNAMIC 2 informace pro zavaděč[2]
PT_INTERP 3 cesta k interpretu programu ELF[1][2]
PT_NOTE 4 pomocné informace o programu (požadavky na OS/ABI, min. verzi jádra,...)[1][2]
PT_SHLIB 5 [rezervováno][2]
PT_PHDR 6 pozice a velikost tabulky programů[2]

Nástroje

editovat
  • readelf je Unixová binární utilita, která zobrazuje informace o jednom nebo více ELF souborech; GNU implementace pochází z GNU Binutils
  • elfdump je příkaz v Solarisu na prohlížení informací uložených v ELF souboru
  • objdump poskytuje široký rozsah informací o ELF souborech a jiných objektových formátech

ELF v operačních systémech

editovat

Formát ELF nahradil některé starší spustitelné soubory v různých aplikačních prostředích. Je využíván v těchto operačních systémech:

Kromě již zmíněných herních konzolí je používán také v některých operačních systémech pro mobilní zařízení:

FatELF je rozšířením binárního formátu ELF, který umožňuje, aby spustitelný soubor obsahoval kód pro různé počítačové platformy. Kromě oddělení architektury procesoru (pořadí bajtů, velikost slova (32/64bit), instrukční sady atd.) je potenciální výhodou oddělení softwarových platforem (např. soubory, které podporují několik verzí ABI jádra pro stejnou platformu).

Reference

editovat
  1. a b c d e f g h i j k l m n o p q r s t u v w POLÁČEK, Marek. Introduction to ELF [online prezentace]. Brno, 2012 [cit. 2014-04-08]. Dostupné online Archivováno 16. 5. 2012 na Wayback Machine..
  2. a b c d e f g h i j k l m TOOL INTERFACE STANDARD (TIS). Executable and Linking Format (ELF) Specification [online]. Version 1.2. May 1995 [cit. 2014-04-08]. Dostupné online.

Související články

editovat