Man elf (5) a végrehajtható és összekapcsolható fájlok formátuma (elf)

A fejlécfájlban Az ELF formátum a végrehajtható bináris fájlok számára van meghatározva. Ezek a fájlok közé tartoznak a szokásos végrehajtható fájlok, áthelyezhető objektumfájlok, fő fájlok és közös objektumok.

Az ELF formátumú végrehajtható fájl az ELF fejlécből, a programfejléc táblából vagy a fejléc táblázatból (vagy mindkét táblázatból) áll. Az ELF fejléc mindig a fájl elején található. A program címtáblázatának és a fejléc táblázatnak a helye az ELF fejlécben van megadva. A két táblázat leírja a fájl tartalmának többi részét.

Ez a fejlécfájl a fenti fejléceket C-struktúrák formájában írja le, és tartalmazza a dinamikus partíciók szerkezetét, a mozgás partíciókat és a szimbólumtáblákat is.

Minden N-bites architektúránál a megfelelő típust használjuk (N = 32.64; ElfN lehet Elf32 vagy Elf64; uintN_t lehet uint32_t vagy uint64_t):

(Megjegyzés: a * BSD némileg eltérő terminológiát Tehát Elf64_Half --- kétszer Elf32_Half és Elf64Quarter --- uint16_t Nem összekeverendő, majd ezeket a típusokat helyébe a különböző típusú ....)

Ennek a fájlformátumnak az összes adatszerkezete követi a megfelelő osztály "természetes" méretét és illesztési elveit. Szükség esetén az adatstruktúrák kifejezetten meghatározott tömböt tartalmaznak 4 bájtos objektumok 4 bájthoz való igazításához, hogy a struktúrák mérete 4-es többszörös legyen stb.

Az ELF fejlécet Elf32_Ehdr vagy Elf64_Ehdr írja le.

A futtatható vagy megosztott objektumfájl programjának fejléc táblája egy struktúrák tömbje, amelyek mindegyike egy szegmenst ír le, vagy egyéb információkat tartalmaz, amelyeket a rendszernek a program végrehajtására kell készíteni. Az objektumfájl-szegmens egy vagy több szakaszból áll. A programfejlécek csak a végrehajtható és a megosztott objektumfájlokhoz szükségesek. A program fejlécének mérete az ELF fejlécben lévő fájlban szerepel az e_phentsize és e_phnum mezőkben. Az ELF program fejlécét Elf32_Phdr vagy Elf64_Phdr írja le. az architektúrától függően:

A legfontosabb különbség a 32 bites és a 64 bites programfejléc között a p_flags mező.

A partíciós fejlécek táblázatából megtalálhatja a fájl összes partíciójának helyét. Ez egy Elf32_Shdr vagy Elf64_Shdr struktúrák tömbje. A fájl fejléc táblázatának elején az ELF fejléc e_shoff mezője (bájtban) jelenik meg. Az e_shnum tartalmazza a elemek számát a fejléc táblázatban. Az E_shentsize tartalmazza az egyes elemek méretét bájtban.

A partíció fejléc táblázatában található elem indexe erre a tömbre mutat. A partíció fejléc táblázatban található elemek egyes indexei fenntartva: a SHN_LORESERVE és az SHN_HIRESERVE induló eleme és mutatói. A kezdő elemet az e_phnum ELF kiterjesztéseiben használják. e_shnum és e_strndx; más esetekben a kezdeti elem minden mezője nulla. Az objektumfájlban nincsenek részek ezekkel a speciális indexekkel:

A szakasz fejlécének szerkezete a következő:

Nincs jelentős különbség a 32 bites és a 64 bites szakaszfejlécek között.

A program és a vezérlőinformáció különböző szakaszokban található meg:

A sorok táblázatos részei olyan karakter szekvenciákat tartalmaznak, amelyek nulla értékűek, és amelyeket általában sztringeknek neveznek. Az objektumfájl ezeket a sorokat használja a karakterek és szakaszok nevéhez. A sorok táblázatos részében lévő indexre mutató sort jelent. Az null index nélküli első bájt byt null ('\ 0') határozza meg. Hasonlóképpen annak biztosítása érdekében, hogy minden sor nulla legyen, a sor táblázat utolsó bájtja is tartalmaz egy null bájtot.

Az objektumfájl-tábla tartalmazza a programban definiált szimbólumok és hivatkozások elhelyezéséhez és áthelyezéséhez szükséges információkat. A szimbólumtáblázat-index egy elemre utal ebben a tömbben.

A 32 bites és a 64 bites verziók ugyanazok a mezők, csak a sorrendjük eltér.

st_name Ez a mező egy objektumfájl karakterlánc táblázatában szereplő elemet tartalmaz, amely a szimbólumnevek szimbolikus ábrázolását tartalmazza. Ha az érték nem nulla, akkor ez a sorok táblázatának indexe, amellyel meghatározza a szimbólum nevét. Ellenkező esetben a szimbólum táblának nincs neve. st_value Ez a mező a megfelelő karakter értékét tartalmazza. st_size Sok dimenzió sok karakterrel társul. Ez a mező nulla értékre van állítva, ha a karakter nem rendelkezik méretével vagy méretével. st_info Ez a mező megadja a karaktertípust és a kötelező attribútumokat: STT_NOTYPE A karaktertípus nincs megadva. STT_OBJECT A szimbólum megfelel az adatobjektumnak. STT_FUNC A szimbólum egy függvénynek vagy más végrehajtható kódnak felel meg. STT_SECTION A szimbólum megfelel a szakasznak. Az ilyen típusú szimbólum táblázat elemei elsősorban mozgáshoz vannak kötve és általában STB_LOCAL kötéseket tartalmaznak. STT_FILE Megegyezés alapján a szimbólumnevet a megfelelő objektumfájl forrásfájl nevéhez rendeli. A fájlszimbólum STB_LOCAL kötéseket tartalmaz. az SHN_ABS szakasz indexe. és előtte egy másik STB_LOCAL karakter, ha van ilyen. STT_LOPROC Minden érték ettől, és több, STT_HIPROC befogadó számára tartanak fenn, processzor-orientált szemantika. STT_HIPROC Minden olyan érték, kezdve ezzel és kevesebbel, az STT_LOPROC bevonásával, a processzor-orientált szemantikához van fenntartva. STB_LOCAL A helyi karakterek nem láthatók az objektumfájlon kívül, amely tartalmazza a meghatározásaikat. Azonos nevekkel rendelkező helyi szimbólumok létezhetnek több fájlban anélkül, hogy egymásba ütköznének. STB_GLOBAL A globális karakterek az összevonás után minden objektumfájlban láthatóak. Egy globális szimbólum egy fájlban történő definiálása ugyanazon szimbólumon egy másik fájlban egy nem definiált hivatkozást old meg. STB_WEAK A gyenge szimbólumok hasonlóak a globális szimbólumokhoz, de meghatározásaik alacsonyabbak. STB_LOPROC Minden érték ettől, és több, STB_HIPROC befogadó számára tartanak fenn, processzor-orientált szemantika. STB_HIPROC Minden érték ettől kevesebb a STB_LOPROC befogadó számára tartanak fenn, processzor-orientált szemantika. Makrók a kötési mezők csomagolásához és kicsomagolásához: ELF32_ST_BIND (info) vagy ELF64_ST_BIND (info) a kötés lekérése a st_info értékről. ELF32_ST_TYPE (info) vagy ELF64_ST_TYPE (info)
kivonja a típust a st_info-ból. ELF32_ST_INFO (kötés, típus) vagy ELF64_ST_INFO (kötés, típus)
konvertálja a kötést és a típust st_info-ra. st_other Ez a mező határozza meg a karakter láthatóságát. STV_DEFAULT Alapértelmezett karakterek láthatósági szabályai. STV_INTERNAL A rejtett osztály, amely a processzortól függ. STV_HIDDEN A szimbólum nem érhető el más modulokban. STV_PROTECTED Unloadable, nem exportált.

Ezek a makrók szolgálják a láthatóság típusát:

ELF32_ST_VISIBILITY (egyéb) vagy ELF64_ST_VISIBILITY (egyéb)

st_shndx A szimbólumtáblázat minden eleme "meghatározott" egy bizonyos szakasz tekintetében. Ez a mező a fejléc táblázat megfelelő indexét tartalmazza.

A mozgás a szimbolikus definíciókhoz kapcsolódó szimbolikus kapcsolatok összekapcsolásának folyamata. A mozgatható fájloknak rendelkezniük kell olyan információkkal, amelyek leírják a partíció tartalmának módosítását, hogy a végrehajtható és dinamikus objektumfájlok tartalmazzák a helyes információkat a programfolyamati képhez. Ehhez áthelyezések vannak.

Mozgatható szerkezetek, amelyeknek nincs szüksége adalékra:

Mozgatható szerkezetek, amelyekhez adalékot igényelnek:

A .dynamic rész több struktúrát tartalmaz, amelyek a dinamikus elrendezéssel kapcsolatos információkat tartalmaznak. A d_tag ​​mező a d_un értelmezését szabályozza.

Az ELF először a V rendszerben jelent meg. Az ELF formátum elfogadott szabvány.

Az e_phnum kiterjesztései. e_shnum és e_strndx a megfelelő Linux kiterjesztések. Ezeket támogatja a Sun, a BSD és az AMD64 is; További információért lásd: "LÁSD MÉG".