Executable and Linkable Format

Executable and Linkable Format lyhyesti ELF on yleinen tiedostomuoto suoritettaville ohjelmille, objektitiedostoille, jaetuille kirjastoille ja coredump-tiedostoille. Rakenteeltaan ELF on joustava, laajennettavissa oleva ja alustariippumaton tiedostomuoto.

ELF on määritelty System V ABI -määrittelyssä ja Tool Interface Standards (TIS) määrittelyssä: alkuperäisen ELF-muodon kehitti ja julkaisi Unix System Laboratories (USL).

Tiedoston rakenne
ELF-tiedosto sisältää ELF-ylätunnisteen (), joka muun muassa määrittää onko ohjelma 32 vai 64-bittinen. ELF-ylätunnisteen jälkeen tiedostossa on ohjelman ylätunnistetaulukko (), itse ohjelma ja viimeiseksi ohjelman osuuksien ylätunnistetaulukko ().

00000000  7f 45 4c 46 02 01 01 00  00 00 00 00 00 00 00 00  |.ELF............|

00000010  02 00 3e 00 01 00 00 00  c5 48 40 00 00 00 00 00  |..>......H@.....|

Esimerkki ELF-ylätunnisteen hexdumpista

ELF-ylätunniste
ELF-ylätunniste määrittää onko ohjelma 32- vai 64-bittinen. Bittisyys vaikuttaa tietueiden offsettiin.

+ ELF header Offset Koko (tavuja)  Nimi  Kuvaus 32-bittinen  64-bittinen  32-bittinen  64-bittinen 0x00  4  e_ident[EI_MAG0] e_ident[EI_MAG3] 0x7F ja 45 4c 46 (ELF) muodostavat maagisen numeron. 0x04  1  e_ident[EI_CLASS]Tämä tavu on 1 jos kyseessä on 32-bittinen ohjelma tai jos 2 niin ohjelma on 64-bittinen. 0x05  1  e_ident[EI_DATA]Määrittää ohjelman tavujärjestyksen. 0x06  1  e_ident[EI_VERSION]Määrittää ELF-version. 1 tarkoittaa alkuperäistä. 0x07  1  e_ident[EI_OSABI]Määrittää ohjelman ABI:n.
ArvoABI0x00System V0x01HP-UX0x02NetBSD0x03Linux0x04GNU Hurd0x06Solaris0x07AIX0x08IRIX0x09FreeBSD0x0ATru640x0BNovell Modesto0x0COpenBSD0x0DOpenVMS0x0ENonStop Kernel0x0FAROS0x10Fenix OS0x11CloudABI
Usein määritetty nollaan riippumatta alustasta. 0x08  1  e_ident[EI_ABIVERSION]Tarkempi määritys ABI:n versiosta. 0x09  7  e_ident[EI_PAD]Toistaiseksi ei käytössä. 0x10  2  e_typeMäärittää objektin tyypin. 0x12  2  e_machineMäärittää prosessoriarkkitehtuurin
ArvoISA0x00 Arkkitehtuuria ei määritetty0x02SPARC0x03x860x08MIPS0x14PowerPC0x16S3900x28ARM0x2ASuperH0x32IA-640x3Ex86-640xB7AArch640xF3RISC-V 0x14  4  e_versionMäärittää ELF-version. 1 tarkoittaa alkuperäistä. 0x18  4  8  e_entryMäärittää osoitteen muistista, mistä ohjelman suoritus alkaa. Voi olla 32- tai 64-bittinen. 0x1C  0x20  4  8  e_phoffOsoittaa ohjelman ylätunnistetaulukon alkuun. 0x20  0x28  4  8  e_shoffOsoittaa osuuksien ylätunnistetaulukon alkuun. 0x24  0x30  4  e_flagsKentän tulkinta riippuu kohdearkkitehtuurista. 0x28  0x34  2  e_ehsizeSisältää ELF-ylätunnisteen koon. 0x2A  0x36  2  e_phentsizeContains the size of a program header table entry.  0x2C  0x38 2  e_phnumSisältää osuuksien määrän ohjelman ylätunnistetaulukosta. 0x2E  0x3A  2  e_shentsizeContains the size of a section header table entry. 0x30  0x3C  2  e_shnumSisältää osuuksen määrän osuuksien ylätunnistetaulukosta. 0x32  0x3E  2  e_shstrndxContains index of the section header table entry that contains the section names.

Ohjelman ylätunniste
Ohjelman ylätunnistetaulukko kertoo, kuinka ohjelma tulee ladata muistiin.

+ Program header Offset Koko (tavuja)  Nimi  Kuvaus 32-bittinen  64-bittinen  32-bittinen  64-bittinen 0x00  4 p_typeMäärittää segmentin tyypin.
ValueName0x00000000PT_NULL0x00000001PT_LOAD0x00000002PT_DYNAMIC0x00000003PT_INTERP0x00000004PT_NOTE0x00000005PT_SHLIB0x00000006PT_PHDR0x60000000PT_LOOS0x6FFFFFFFPT_HIOS0x70000000PT_LOPROC0x7FFFFFFFPT_HIPROC
PT_LOOS to PT_HIOS (PT_LOPROC to PT_HIPROC) is an inclusive reserved ranges for operating system (processor) specific semantics.   0x04    4 p_flagsSegmentti kohtainen tietue. 0x04  0x08  4  8p_offsetSegmentin offsetti. 0x08  0x10  4  8 p_vaddrSegmentin virtuaalinen muistiosoite. 0x0C  0x18  4  8 p_paddrFyysinen muistiosoite 0x10  0x20  4  8 p_fileszSegmentin koko. 0x14  0x28  4  8 p_memszSegmentin koko muistissa. 0x18    4   p_flagsSegmentti kohtainen tietue. 0x1C  0x30  4  8 p_align0 and 1 specify no alignment. Otherwise should be a positive, integral power of 2, with p_vaddr equating p_offset modulus p_align.0x200x38Ohjelman ylätunnisteen loppu (koko).

Osion ylätunniste
OffsetKoko (Tavuja)NimiKuvaus32-bittinen64-bittinen32-bittinen64-bittinen0x004sh_nameAn offset to a string in the .shstrtab section that represents the name of this section0x044sh_typeIdentifies the type of this header.
ValueNameMeaning0x0SHT_NULLSection header table entry unused0x1SHT_PROGBITSProgram data0x2SHT_SYMTABSymbol table0x3SHT_STRTABString table0x4SHT_RELARelocation entries with addends0x5SHT_HASHSymbol hash table0x6SHT_DYNAMICDynamic linking information0x7SHT_NOTENotes0x8SHT_NOBITSProgram space with no data (bss)0x9SHT_RELRelocation entries, no addends0x0ASHT_SHLIBReserved0x0BSHT_DYNSYMDynamic linker symbol table0x0ESHT_INIT_ARRAYArray of constructors0x0FSHT_FINI_ARRAYArray of destructors0x10SHT_PREINIT_ARRAYArray of pre-constructors0x11SHT_GROUPSection group0x12SHT_SYMTAB_SHNDXExtended section indeces0x13SHT_NUMNumber of defined types.0x60000000SHT_LOOSStart OS-specific..........0x0848sh_flagsIdentifies the attributes of the section.
ValueNameMeaning0x1SHF_WRITEWritable0x2SHF_ALLOCOccupies memory during execution0x4SHF_EXECINSTRExecutable0x10SHF_MERGEMight be merged0x20SHF_STRINGSContains nul-terminated strings0x40SHF_INFO_LINK'sh_info' contains SHT index0x80SHF_LINK_ORDERPreserve order after combining0x100SHF_OS_NONCONFORMINGNon-standard OS specific handling required0x200SHF_GROUPSection is member of a group0x400SHF_TLSSection hold thread-local data0x0ff00000SHF_MASKOSOS-specific0xf0000000SHF_MASKPROCProcessor-specific0x4000000SHF_ORDEREDSpecial ordering requirement (Solaris)0x8000000SHF_EXCLUDESection is excluded unless referenced or allocated (Solaris)0x0C0x1048sh_addrVirtual address of the section in memory, for sections that are loaded.0x100x1848sh_offsetOffset of the section in the file image.0x140x2048sh_sizeSize in bytes of the section in the file image. May be 0.0x180x284sh_linkContains the section index of an associated section. This field is used for several purposes, depending on the type of section.0x1C0x2C4sh_infoContains extra information about the section. This field is used for several purposes, depending on the type of section.0x200x3048sh_addralignContains the required alignment of the section. This field must be a power of two.0x240x3848sh_entsizeContains the size, in bytes, of each entry, for sections that contain fixed-size entries. Otherwise, this field contains zero.0x280x40End of Section Header (size)

 Käyttökohteet 
 Unixin kaltaiset alustat 
ELF-muoto on korvannut vanhempia muotoja useilla alustoilla kuten a.out ja COFF-muodot Unixin kaltaisissa käyttöjärjestelmissä:
 Linux
 Solaris / Illumos
 IRIX
 FreeBSD
 NetBSD
 OpenBSD
 Redox
 DragonFly BSD
 Syllable
 HP-UX (pois lukien 32-bittiset PA-RISC-ohjelmat jotka jatkavat SOM-muodon käyttämistä)
 QNX Neutrino
 MINIX

 Ei-Unix -alustat 
ELF on myös käytössä eräillä ei-Unix alustoilla kuten:
 OpenVMS, Itanium ja x86-64 versiothttps://vmssoftware.com/pdfs/State_of_Port_20160906.pdf 
 BeOS Revision 4 ja myöhemmät x86-pohjaisille tietokoneille (joissa se korvasi Portable Executable -muodon; PowerPC-versio pysyi Preferred Executable Format -muodossa)
 Haiku, avoimen lähdekoodin uudelleentoteutus BeOSista
 RISC OS
 Stratus VOS, PA-RISC ja x86 versioissa
 Windows 10 Anniversary Update using the Windows Subsystem for Linux.
 SkyOS
 Fuchsia OS
 Z/TPF
 HPE NonStop OS p. 44 archived from the original  on 2018-5-30

 Pelikonsolit 
Eräät pelikonsolit käyttävät ELF-muotoa:
 PlayStation Portable,PlayStation Portable use encrypted & relocated ELF : PSP PlayStation Vita, PlayStation 2, PlayStation 3, PlayStation 4
 GP2X
 Dreamcast
 Wii

 PowerPC 

Muut alustat PowerPC-suorittimilla jotka käyttävät ELF-muotoa:
 AmigaOS 4, ELF on korvannut aiemman Extended Hunk Format (EHF) muodon, jota käytettiin PPC-suorittimella varustettujen laajennuskorttien kanssa
 MorphOS
 AROS

 Mobiililaitteet 

Eräät käyttöjärjestelmät matkapuhelimille ja muille mobiililaitteille käyttävät ELF-muotoa:
 Symbian OS v9 käyttää E32ImageSymbian OS executable file format -muotoa joka perustuu ELF-muodolle;
 Sony Ericsson, muun muassa W800i, W610, W300 ja niin edelleen
 Siemens, SGOLD ja SGOLD2 alustat: Siemens C65:stä S75:een ja BenQ-Siemens E71/EL71;
 Motorola, muun muassa E398, SLVR L7, v360, v3i (ja kaikki LTE2-puhelimet joissa on päivitys).
 Bada, esimerkiksi Samsung Wave S8500.
 Nokia puhelimet ja tabletit Maemo- tai Meego-käyttöjärjestelmällä kuten Nokia N900.
 Android käyttää ELF .so (shared object) kirjastoja Java Native Interfacelle. Android Runtime (ART) (oletuksena Android 5.0 "Lollipop" versiosta alkaen) kaikki sovellukset käännetään natiivisti ELF-binääreiksi asennuksen yhteydessä.

Ohjelmia
 readelf ohjelma joka näyttää tietoa elf-tiedostoista.
 elfutils vaihtoehtoinen ohjelmapaketti GNU Binutilsin tilalle, joka on tehty erityisesti Linuxia varten.
 elfdump ohjelma joka näyttää tietoa elf-tiedostosta.
 objdump ohjelma jolla voidaan tarkastella monipuolisesti eri tietoja elf-tiedostoista ja muista binääriformaateista.
 file ohjelma joka näyttää tietoa elf-tiedostoista.

Lähteet

Aiheesta muualla
 Dokumentaatio

Luokka:Tietotekniikka