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. {| class="wikitable" Arvo ABI 0x00 System V 0x01 HP-UX 0x02 NetBSD 0x03 Linux 0x04 GNU Hurd 0x06 Solaris 0x07 AIX 0x08 IRIX 0x09 FreeBSD 0x0A Tru64 0x0B Novell Modesto 0x0C OpenBSD 0x0D OpenVMS 0x0E NonStop Kernel 0x0F AROS 0x10 Fenix OS 0x11 CloudABI ===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_type` Value Name 0x00000000 `PT_NULL` 0x00000001 `PT_LOAD` 0x00000002 `PT_DYNAMIC` 0x00000003 `PT_INTERP` 0x00000004 `PT_NOTE` 0x00000005 `PT_SHLIB` 0x00000006 `PT_PHDR` 0x60000000 `PT_LOOS` 0x6FFFFFFF `PT_HIOS` 0x70000000 `PT_LOPROC` 0x7FFFFFFF `PT_HIPROC` ===Osion ylätunniste=== Offset Koko (Tavuja) Nimi Kuvaus 32-bittinen 64-bittinen 32-bittinen 64-bittinen 0x00 4 sh_name An offset to a string in the .shstrtab section that represents the name of this section 0x04 4 sh_type Identifies the type of this header. {| class="wikitable" Value Name Meaning 0x0 SHT_NULL Section header table entry unused 0x1 SHT_PROGBITS Program data 0x2 SHT_SYMTAB Symbol table 0x3 SHT_STRTAB String table 0x4 SHT_RELA Relocation entries with addends 0x5 SHT_HASH Symbol hash table 0x6 SHT_DYNAMIC Dynamic linking information 0x7 SHT_NOTE Notes 0x8 SHT_NOBITS Program space with no data (bss) 0x9 SHT_REL Relocation entries, no addends 0x0A SHT_SHLIB Reserved 0x0B SHT_DYNSYM Dynamic linker symbol table 0x0E SHT_INIT_ARRAY Array of constructors 0x0F SHT_FINI_ARRAY Array of destructors 0x10 SHT_PREINIT_ARRAY Array of pre-constructors 0x11 SHT_GROUP Section group 0x12 SHT_SYMTAB_SHNDX Extended section indeces 0x13 SHT_NUM Number of defined types. 0x60000000 SHT_LOOS Start OS-specific. ... ... ... == 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