Executable and Linkable Format
Tämä artikkeli tai sen osa on tuotu vieraskielisestä lähteestä ja käännös on keskeneräinen. Voit auttaa Wikipediaa tekemällä käännöksen loppuun. |
Executable and Linkable Format lyhyesti ELF on yleinen tiedostomuoto suoritettaville ohjelmille, objektitiedostoille, jaetuille kirjastoille ja coredump-tiedostoille.[1] Rakenteeltaan ELF on joustava, laajennettavissa oleva ja alustariippumaton tiedostomuoto.
ELF on määritelty System V ABI -määrittelyssä[2] ja Tool Interface Standards (TIS) määrittelyssä: alkuperäisen ELF-muodon kehitti ja julkaisi Unix System Laboratories (USL).[3]
Tiedoston rakenne
[muokkaa | muokkaa wikitekstiä]ELF-tiedosto sisältää ELF-ylätunnisteen (engl. header), joka muun muassa määrittää onko ohjelma 32 vai 64-bittinen. ELF-ylätunnisteen jälkeen tiedostossa on ohjelman ylätunnistetaulukko (engl. Program header table), itse ohjelma ja viimeiseksi ohjelman osuuksien ylätunnistetaulukko (engl. Section header table).[1]
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[4]
|
ELF-ylätunniste
[muokkaa | muokkaa wikitekstiä]ELF-ylätunniste määrittää onko ohjelma 32- vai 64-bittinen. Bittisyys vaikuttaa tietueiden offsettiin.
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.
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_type | Määrittää objektin tyypin. | ||||||||||||||||||||||||||||||||||||||
0x12 | 2 | e_machine | Määrittää prosessoriarkkitehtuurin
| ||||||||||||||||||||||||||||||||||||||
0x14 | 4 | e_version | Määrittää ELF-version. 1 tarkoittaa alkuperäistä. | ||||||||||||||||||||||||||||||||||||||
0x18 | 4 | 8 | e_entry | Määrittää osoitteen muistista, mistä ohjelman suoritus alkaa. Voi olla 32- tai 64-bittinen. | |||||||||||||||||||||||||||||||||||||
0x1C | 0x20 | 4 | 8 | e_phoff | Osoittaa ohjelman ylätunnistetaulukon alkuun. | ||||||||||||||||||||||||||||||||||||
0x20 | 0x28 | 4 | 8 | e_shoff | Osoittaa osuuksien ylätunnistetaulukon alkuun. | ||||||||||||||||||||||||||||||||||||
0x24 | 0x30 | 4 | e_flags | Kentän tulkinta riippuu kohdearkkitehtuurista. | |||||||||||||||||||||||||||||||||||||
0x28 | 0x34 | 2 | e_ehsize | Sisältää ELF-ylätunnisteen koon. | |||||||||||||||||||||||||||||||||||||
0x2A | 0x36 | 2 | e_phentsize | Contains the size of a program header table entry. | |||||||||||||||||||||||||||||||||||||
0x2C | 0x38 | 2 | e_phnum | Sisältää osuuksien määrän ohjelman ylätunnistetaulukosta. | |||||||||||||||||||||||||||||||||||||
0x2E | 0x3A | 2 | e_shentsize | Contains the size of a section header table entry. | |||||||||||||||||||||||||||||||||||||
0x30 | 0x3C | 2 | e_shnum | Sisältää osuuksen määrän osuuksien ylätunnistetaulukosta. | |||||||||||||||||||||||||||||||||||||
0x32 | 0x3E | 2 | e_shstrndx | Contains index of the section header table entry that contains the section names. |
Ohjelman ylätunniste
[muokkaa | muokkaa wikitekstiä]Ohjelman ylätunnistetaulukko kertoo, kuinka ohjelma tulee ladata muistiin.
Offset | Koko (tavuja) | Nimi | Kuvaus | ||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
32-bittinen | 64-bittinen | 32-bittinen | 64-bittinen | ||||||||||||||||||||||||||
0x00 | 4 | p_type | Määrittää segmentin tyypin.
PT_LOOS to PT_HIOS (PT_LOPROC to PT_HIPROC) is an inclusive reserved ranges for operating system (processor) specific semantics. | ||||||||||||||||||||||||||
0x04 | 4 | p_flags | Segmentti kohtainen tietue. | ||||||||||||||||||||||||||
0x04 | 0x08 | 4 | 8 | p_offset | Segmentin offsetti. | ||||||||||||||||||||||||
0x08 | 0x10 | 4 | 8 | p_vaddr | Segmentin virtuaalinen muistiosoite. | ||||||||||||||||||||||||
0x0C | 0x18 | 4 | 8 | p_paddr | Fyysinen muistiosoite | ||||||||||||||||||||||||
0x10 | 0x20 | 4 | 8 | p_filesz | Segmentin koko. | ||||||||||||||||||||||||
0x14 | 0x28 | 4 | 8 | p_memsz | Segmentin koko muistissa. | ||||||||||||||||||||||||
0x18 | 4 | p_flags | Segmentti kohtainen tietue. | ||||||||||||||||||||||||||
0x1C | 0x30 | 4 | 8 | p_align | 0 and 1 specify no alignment. Otherwise should be a positive, integral power of 2, with p_vaddr equating p_offset modulus p_align.
| ||||||||||||||||||||||||
0x20 | 0x38 | Ohjelman ylätunnisteen loppu (koko). |
Osion ylätunniste
[muokkaa | muokkaa wikitekstiä]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.
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
0x08 | 4 | 8 | sh_flags | Identifies the attributes of the section.
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
0x0C | 0x10 | 4 | 8 | sh_addr | Virtual address of the section in memory, for sections that are loaded. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
0x10 | 0x18 | 4 | 8 | sh_offset | Offset of the section in the file image. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
0x14 | 0x20 | 4 | 8 | sh_size | Size in bytes of the section in the file image. May be 0. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
0x18 | 0x28 | 4 | sh_link | Contains the section index of an associated section. This field is used for several purposes, depending on the type of section. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
0x1C | 0x2C | 4 | sh_info | Contains extra information about the section. This field is used for several purposes, depending on the type of section. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
0x20 | 0x30 | 4 | 8 | sh_addralign | Contains the required alignment of the section. This field must be a power of two. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
0x24 | 0x38 | 4 | 8 | sh_entsize | Contains the size, in bytes, of each entry, for sections that contain fixed-size entries. Otherwise, this field contains zero. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
0x28 | 0x40 | End of Section Header (size) |
Käyttökohteet
[muokkaa | muokkaa wikitekstiä]Unixin kaltaiset alustat
[muokkaa | muokkaa wikitekstiä]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[7]
- 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[8]
Ei-Unix -alustat
[muokkaa | muokkaa wikitekstiä]ELF on myös käytössä eräillä ei-Unix alustoilla kuten:
- OpenVMS, Itanium ja x86-64 versiot[9][10]
- 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[11]
- Stratus VOS, PA-RISC ja x86 versioissa
- Windows 10 Anniversary Update using the Windows Subsystem for Linux.[12][13]
- SkyOS
- Fuchsia OS
- Z/TPF
- HPE NonStop OS[14]
Pelikonsolit
[muokkaa | muokkaa wikitekstiä]Eräät pelikonsolit käyttävät ELF-muotoa:
- PlayStation Portable,[15] PlayStation Vita, PlayStation 2, PlayStation 3, PlayStation 4
- GP2X
- Dreamcast
- Wii
PowerPC
[muokkaa | muokkaa wikitekstiä]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
[muokkaa | muokkaa wikitekstiä]Eräät käyttöjärjestelmät matkapuhelimille ja muille mobiililaitteille käyttävät ELF-muotoa:
- Symbian OS v9 käyttää E32Image[16] -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[17]) 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
[muokkaa | muokkaa wikitekstiä]readelf
ohjelma joka näyttää tietoa elf-tiedostoista.elfutils
vaihtoehtoinen ohjelmapaketti GNU Binutilsin tilalle, joka on tehty erityisesti Linuxia varten.[18]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
[muokkaa | muokkaa wikitekstiä]- ↑ a b 0xax.gitbooks.io 0xax.gitbooks.io. Arkistoitu 25.2.2018. Viitattu 25.2.2018. (englanniksi)
- ↑ System V Application Binary Interface (PDF) (Edition 4.1) sco.com. 18.3.1997. Viitattu 22.11.2020. (englanniksi)
- ↑ Tool Interface Standard (TIS) Executable and Linking Format (ELF) Specification (PDF) (Version 1.2) refspecs.linuxbase.org. toukokuu 1995. Viitattu 22.11.2020. (englanniksi)
- ↑ Available lexers — Pygments pygments.org.
- ↑ ELF Header July 2000. Sco.com. Viitattu 7.2.2014.
- ↑ Program Header July 2000. Sco.com. Viitattu 5.4.2017.
- ↑ Binary Formats docs.freebsd.org. Arkistoitu 31.3.2019. Viitattu 16.8.2019.
- ↑ MinixReleases – Minix Wiki Wiki.minix3.org. Arkistoitu 30.3.2013. Viitattu 19.1.2014.
- ↑ https://vmssoftware.com/pdfs/State_of_Port_20160906.pdf (Arkistoitu – Internet Archive)
- ↑ HP OpenVMS Linker Utility Manual h30266.www3.hpe.com. Arkistoitu 14.7.2018. Viitattu 14.7.2018.
- ↑ GCCSDK – RISC OS 22.4.2012. Riscos.info. Arkistoitu 19.2.2014. Viitattu 19.1.2014.
- ↑ Announcing Windows 10 Insider Preview Build 14316 blogs.windows.com. 6.4.2016. Viitattu 10.4.2016. (englanti)
- ↑ Foley, Mary Jo: Under the hood of Microsoft's Windows Subsystem for Linux | ZDNet zdnet.com. Viitattu 19.8.2016.
- ↑ Guardian Programmer's Guide Hewlett Packard Enterprise. Arkistoitu 30.5.2018. Viitattu 30.5.2018. p. 44 archived from the original (Arkistoitu – Internet Archive) on 2018-5-30
- ↑ PlayStation Portable use encrypted & relocated ELF : PSP
- ↑ Symbian OS executable file format
- ↑ Rosen, Kenneth; Host, Douglas; Klee, Rachel; Rosinski, Richard: UNIX: The Complete Reference, s. 707. 2 painos McGraw Hill Professional, 2007. ”Dynamically linked libraries are also called shared objects (.so).” ISBN 9780071706988 Teoksen verkkoversio.
- ↑ elfutils sourceware.org. Viitattu 30 April 2017.