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í

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

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ů

  • 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

  • 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

AtributVýznam
e_identidentifikace ELF (magic number), typ architektury, verze ABI,...[1]
e_typetyp objektového souboru[1]
e_machinecílová architektura[1]
e_versionverze objektového souboru[2]
e_entryvirtuální adresa vstupního bodu programu[1]
e_phoffukazatel na pozici tabulky programů v souboru[1]
e_shoffukazatel na pozici tabulky sekcí v souboru[1]
e_flagsprocesorové příznaky[1]
e_ehsizevelikost ELF hlavičky (v bajtech)[1]
e_phentsizevelikost záznamu v tabulce programů (v bajtech)[1]
e_phnumpočet záznamů v tabulce programů[1]
e_shentsizevelikost záznamu v tabulce sekcí (v bajtech)[1]
e_shnumpočet záznamů v tabulce sekcí[1]
e_shstrndxodkaz na tabulku řetězců[1]

Hlavička tabulky programů

AtributVýznam
p_typetyp segmentu[1]
p_offsetpozice 1. bajtu segmentu od počátku souboru[2]
p_vaddrvirtuální adresa 1. bajtu segmentu v operační paměti[2]
p_paddrfyzická adresa uložení segmentu v operační paměti[1]
p_fileszdélka segmentu v souboru (v bajtech)[2]
p_memszvelikost paměti pro daný segment (v bajtech)[2]
p_flagspříznaky daného segmentu[2]
p_alignzarovnání segmentu v operační paměti a v rámci souboru[2]
Typy segmentů
AtributHodnotaPopis
PT_NULL0[nevyužito][1]
PT_LOAD1označuje segment, který bude nahrán do operační paměti[2]
PT_DYNAMIC2informace pro zavaděč[2]
PT_INTERP3cesta k interpretu programu ELF[1][2]
PT_NOTE4pomocné informace o programu (požadavky na OS/ABI, min. verzi jádra,...)[1][2]
PT_SHLIB5[rezervováno][2]
PT_PHDR6pozice a velikost tabulky programů[2]

Nástroje

  • 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

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í:

  • Symbian OS 9
  • Bada OS

FatELF

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

Související články