Futtatható és linkelhető formátum
Az oldal jelenlegi verzióját még nem ellenőrizték tapasztalt közreműködők, és jelentősen eltérhet a 2021. június 7-én felülvizsgált
verziótól ; az ellenőrzések 6 szerkesztést igényelnek .
Az ELF ( angolul végrehajtható és linkelhető formátum - végrehajtható és linkelhető fájlformátum) egy bináris fájlformátum, amelyet számos modern UNIX-szerű operációs rendszerben használnak, mint például a FreeBSD , Linux , Solaris stb.
Történelem
Az ELF formátumszabványt eredetileg az UNIX System V bináris alkalmazási felület részeként [1] . Ezt követően a bizottság kiválasztotta, és hordozható formátumként fejlesztette ki a 32 bites Intel x86 hardverarchitektúrán futó különféle operációs rendszerek számára . [2] Az ELF gyorsan népszerűvé vált, és miután a HP kiterjesztette a formátumot és közzétette az ELF-64 szabványt, elterjedt a 64 bites platformokra. [3]
Típusok
Az ELF formátumszabvány többféle fájltípust különböztet meg:
- Áthelyezhető fájl – olyan utasításokat és adatokat tárol, amelyek más objektumfájlokhoz kapcsolhatók . Egy ilyen hivatkozás eredménye lehet egy megosztott objektumfájl vagy egy végrehajtható fájl. Ez a típus magában foglalja a statikus könyvtárak objektumfájljait.
- Megosztott objektumfájl - utasításokat és adatokat is tartalmaz, és társítható más áthelyezhető fájlokhoz és megosztott objektumfájlokhoz, aminek eredményeként új objektumfájl jön létre, vagy a program végrehajtásra indításakor az operációs rendszer dinamikusan társítható azt a program végrehajtható fájljával, aminek eredményeként egy végrehajtható kép jön létre a programról. Ez utóbbi esetben megosztott könyvtárakról beszélünk.
- Futtatható fájl – teljes leírást tartalmaz, amely lehetővé teszi a rendszer számára, hogy képet készítsen a folyamatról . Beleértve: utasításokat, adatokat, a szükséges megosztott objektumfájlok leírását, valamint a szükséges szimbolikus és hibakeresési információkat.
Formátum
Minden ELF fájl a következő részekből áll:
Fájl fejléce
A fájlfejléc (ELF Header) rögzített helyen található a fájl elején, és általános leírást tartalmaz a fájl szerkezetéről és főbb jellemzőiről, mint például: típus, formátum verzió, processzor architektúra , virtuális belépési pont címe , méretek és eltolások a fájl többi részéhez. A fejléc 52 bájt 32 bites fájlok esetén, vagy 64 bájt 64 bites esetén . Ez a különbség abból adódik, hogy a fájlfejléc három mezőt tartalmaz mutatómérettel, ami 4, illetve 8 bájt a 32, illetve 64 bites processzoroknál . Ezek a mezők e_entry, e_phoffés e_shoff.
ELF fájl fejléc mezői
A méret
|
Név |
Célja
|
MANÓ
32
|
MANÓ
64
|
16
|
e_ident[16] |
A fájl általános jellemzői.
Tömbbájtoke_ident
Index
|
Név
|
Célja
|
0-3
|
EI_MAG0-EI_MAG3
|
Fájl aláírása: 0x7f 0x45 0x4c 0x46.
|
négy
|
EI_CLASS
|
Objektumfájl osztály.
Név
|
Jelentése
|
Leírás
|
ELFCLASSNONE
|
0
|
Helytelen osztály
|
ELFCLASS32
|
egy
|
32 bites objektumfájl
|
ELFCLASS64
|
2
|
64 bites objektumfájl
|
|
5
|
EI_DATA
|
Processzorfüggő adatkódolási módszer.
Név
|
Jelentése
|
Leírás
|
ELFDATANONE
|
0
|
Helytelen típus
|
ELFDATA2LSB
|
egy
|
Kis Endian
|
ELFDATA2MSB
|
2
|
Big Endian
|
|
6
|
EI_VERSION
|
A fejléc ELF verziója. Jelenleg ennek a bájtnak az értéknek kell lennie EV_CURRENT.
Név
|
Jelentése
|
EV_CURRENT
|
egy
|
|
7
|
EI_OSABI
|
A fájlban használt operációs rendszer vagy ABI - specifikus kiterjesztések. Más ELF fájlstruktúrák egyes mezőihez jelzők és mezők tartoznak, amelyek jelentése az operációs rendszertől vagy az ABI-tól függ; ezeknek a mezőknek az értelmezését az adott bájt értéke határozza meg. Ha az objektumfájl nem használ kiterjesztést, javasoljuk, hogy ezt a bájtot értékre állítsa 0. Ha ennek a bájtnak az értéke a -tól ig terjedő tartományban van 64, 255akkor az értelmezése az e_machine ELF fejléc mezőjének értékétől függ. Ebben a tartományban minden architektúra meghatározhatja a saját értékkészletét.
Név
|
Jelentése
|
Leírás
|
ELFOSABI_NONE
|
0
|
UNIX System V ABI
|
ELFOSABI_HPUX
|
egy
|
HP-UX
|
ELFOSABI_NETBSD
|
2
|
NetBSD
|
ELFOSABI_GNU
|
3
|
A fájl GNU ELF kiterjesztést használ ( GNU/Linux )
|
ELFOSABI_SOLARIS
|
6
|
Solaris
|
ELFOSABI_AIX
|
7
|
AIX
|
ELFOSABI_IRIX
|
nyolc
|
IRIX
|
ELFOSABI_FREEBSD
|
9
|
FreeBSD
|
ELFOSABI_TRU64
|
tíz
|
Tru64 UNIX
|
ELFOSABI_MODESTO
|
tizenegy
|
Modesto
|
ELFOSABI_OPENBSD
|
12
|
OpenBSD
|
ELFOSABI_OPENVMS
|
13
|
openvms
|
ELFOSABI_NSK
|
tizennégy
|
Non Stop Kernel
|
ELFOSABI_AROS
|
tizenöt
|
Amiga Research OS
|
ELFOSABI_FENIXOS
|
16
|
fenixOS
|
ELFOSABI_CLOUDABI
|
17
|
CloudABI
|
ELFOSABI_OPENVOS
|
tizennyolc
|
OpenVOS
|
|
64-255
|
Processzor függő értékek
|
|
nyolc
|
EI_ABIVERSION
|
ABI verzió.
|
9
|
EI_PAD
|
T. n. padding byte (töltelék). A jövőbeni használatra fenntartott tömbelemek e_ident. Általában telepítve van 0. Az objektumfájl-olvasók figyelmen kívül hagyják őket.
|
tíz
|
EI_PAD + 1
|
tizenegy
|
EI_PAD + 2
|
12
|
EI_PAD + 3
|
13
|
EI_PAD + 4
|
tizennégy
|
EI_PAD + 5
|
tizenöt
|
EI_PAD + 6
|
|
2
|
e_type |
Fájltípus.
|
2
|
e_machine |
Annak a hardverplatformnak az architektúrája, amelyhez a fájlt létrehozták:
Név
|
Jelentése
|
Leírás
|
EM_NONE
|
0x0
|
Meghatározatlan
|
EM_M32
|
0x01 |
AT&T WE 32100
|
EM_SPARC
|
0x02 |
SPARC
|
EM_386
|
0x03
|
Intel 80386
|
EM_68K
|
0x04 |
Motorola 68000 (M68k)
|
EM_88K
|
0x05 |
Motorola 88000 (M88k)
|
EM_IAMCU
|
0x06 |
Intel MCU
|
EM_860
|
0x07 |
Intel 80860
|
EM_MIPS
|
0x08 |
MIPS
|
EM_S370
|
0x09 |
IBM_System/370
|
EM_MIPS_RS3_LE
|
0x0A |
MIPS R3000 Little-endian
|
|
0x0B - 0x0E |
Fenntartva későbbi használatra
|
EM_PARISC
|
0x0F |
Hewlett-Packard PA-RISC
|
|
0x10 |
Fenntartva későbbi használatra
|
EM_960
|
0x13 |
Intel 80960
|
EM_PPC
|
0x14
|
PowerPC
|
EM_PPC64
|
0x15
|
PowerPC (64 bites)
|
EM_S390
|
0x16 |
S390 , beleértve az S390x-et
|
EM_SPU
|
0x17 |
IBM SPU/SPC
|
|
0x18 - 0x23 |
Fenntartva későbbi használatra
|
EM_V800
|
0x24 |
NEC V800
|
EM_FR20
|
0x25 |
Fujitsu FR20
|
EM_RH32
|
0x26 |
TRW RH-32
|
EM_MCOREésEM_RCE
|
0x27 |
Motorola RCE
|
EM_ARM
|
0x28 |
ARM (ARMv7/Aarch32-ig)
|
EM_OLD_ALPHA
|
0x29 |
Digitális Alpha
|
EM_SH
|
0x2A |
szuperh
|
EM_SPARCV9
|
0x2B |
SPARC 9-es verzió
|
EM_TRICORE
|
0x2C |
Siemens TriCore beágyazott processzor
|
EM_ARC
|
0x2D |
Argonaut RISC Core
|
EM_H8_300
|
0x2E |
Hitachi H8/300
|
EM_H8_300H
|
0x2F |
Hitachi H8/300H
|
EM_H8S
|
0x30 |
Hitachi H8S
|
EM_H8_500
|
0x31 |
Hitachi H8/500
|
EM_IA_64
|
0x32 |
IA-64
|
EM_MIPS_X
|
0x33 |
Stanford MIPS-X
|
EM_COLDFIRE
|
0x34 |
Motorola ColdFire
|
EM_68HC12
|
0x35 |
Motorola M68HC12
|
EM_MMA
|
0x36 |
Fujitsu MMA multimédiás gyorsító
|
EM_PCP
|
0x37 |
Siemens PCP
|
EM_NCPU
|
0x38 |
Sony nCPU beágyazott RISC processzor
|
EM_NDR1
|
0x39 |
Denso NDR1 mikroprocesszor
|
EM_STARCORE
|
0x3A |
Motorola Star*Core processzor
|
EM_ME16
|
0x3B |
Toyota ME16 processzor
|
EM_ST100
|
0x3C |
STMicroelectronics ST100 processzor
|
EM_TINYJ
|
0x3D |
Advanced Logic Corp. TinyJ beágyazott processzorcsalád
|
EM_X86_64
|
0x3E
|
AMD x86-64
|
EM_MCST_ELBRUS
|
0xAF
|
Elbrus (processzor architektúra)
|
EM_TI_C6000
|
0x8C |
TMS320C6000 család
|
EM_AARCH64
|
0xB7 |
ARM 64 bites (ARMv8/Aarch64)
|
EM_RISCV
|
0xF3 |
RISC-V
|
EM_BPF
|
0xF7 |
Berkeley csomagszűrő
|
EM_65816
|
0x101
|
WDC 65C816
|
|
négy
|
e_version |
Formázza meg a verziószámot. Jelenleg csak egy érték tekinthető helyesnek.
Név
|
Jelentése
|
Leírás
|
EV_NONE
|
0
|
Helytelen érték
|
EV_CURRENT
|
egy
|
Jelenlegi verzió
|
|
négy
|
nyolc
|
e_entry |
A belépési pont virtuális címe, amelyre a rendszer a folyamat indulásakor átadja az irányítást. Ha a fájlnak nincs belépési pontja, ez a mező a következőt tartalmazza: 0.
|
négy
|
nyolc
|
e_phoff |
A programfejléc táblázat eltolása a fájl elejétől, bájtban. Ha a fájlnak nincs programfejléc-táblázata, ez a mező tartalmazza a következőt: 0.
|
négy
|
nyolc
|
e_shoff |
A szakaszfejléc táblázat eltolása a fájl elejétől, bájtban. Ha a fájlnak nincs szakaszfejléc-táblázata, ez a mező tartalmazza a következőt: 0.
|
négy
|
e_flags |
A fájlhoz társított processzorspecifikus jelzők . Ha hiányoznak, ez a mező tartalmazza a következőt: 0.
|
2
|
e_ehsize |
Fájlfejléc mérete bájtban ( 5232 bites és 6464 bites fájlokhoz).
|
2
|
e_phentsize |
Egy programfejléc mérete. Minden programfejléc azonos méretű ( 32 bites és 64
32bites fájlokhoz ).56 |
2
|
e_phnum |
A programfejlécek száma. Ha a fájlnak nincs programfejléc-táblázata, ez a mező tartalmazza a következőt: 0.
|
2
|
e_shentsize |
Egy szakaszfejléc mérete. Minden szakaszfejléc azonos méretű ( 32 bites és 64
40bites fájlokhoz ).64 |
2
|
e_shnum |
A szakaszfejlécek száma. Ha a fájlnak nincs szakaszfejléc-táblázata, ez a mező tartalmazza a következőt: 0.
|
2
|
e_shstrndx |
A szakaszfejléc-tábla bejegyzésének indexe, amely leírja a szakasznevek táblázatát (általában ezt a táblát .shstrtab -nak hívják , és egy külön szakaszt jelent). Ha a fájl nem tartalmaz szakasznévtáblázatot, akkor ez a mező tartalmazza a 0.
|
Programfejléc táblázat
A programfejléc-tábla fejléceket tartalmaz, amelyek mindegyike egy külön programszegmenst és annak attribútumait ír le, vagy az operációs rendszernek a program végrehajtásra való felkészítéséhez szükséges egyéb információkat. Ez a táblázat a fájlban bárhol elhelyezhető, helye (a fájl elejéhez képest eltolás) az e_phoffELF fejléc mezőben van leírva.
A programfejléc szerkezetének elemzésekor a p_flags32 bites és a 64 bites ELF fájlok különböző mezőinek helyét találhatjuk. Ez a különbség a szerkezet összehangolásának köszönhető, hogy növelje a feldolgozási hatékonyságot.
Programfejléc mezők
A méret
|
Név
|
Célja
|
MANÓ
32
|
MANÓ
64
|
négy
|
p_type
|
A fejléc által leírt szegmens típusa, vagy a fejléc mezőértékeinek értelmezése.
Név
|
Jelentése
|
Leírás
|
PT_NULL
|
0
|
A cím nincs felhasználva, a többi mező nincs megadva. Ez a típus lehetővé teszi figyelmen kívül hagyott elemek felvételét a fájl programfejléc-táblázatába.
|
PT_LOAD
|
egy
|
A betöltendő szegmens, amelyet a p_fileszés mezők írnak le p_memsz. A fájl bájtjai egy szegmenshez vannak leképezve a memóriában. Ha a memóriaszegmens mérete ( p_memsz) nagyobb, mint a fájlszegmens mérete ( p_filesz), a plusz bájtok nullákkal vannak kitöltve (azonnal követik a szegmensben meghatározott bájtokat). A fájlban lévő szegmens mérete ( p_filesz) nem lehet nagyobb, mint a memóriában lévő szegmens mérete ( p_memsz). A letölthető szegmensek programcímei a programcímek táblázatban a mező értékének megfelelően növekvő sorrendben vannak elrendezve p_vaddr.
|
PT_DYNAMIC
|
2
|
A programfejléc a dinamikus linkelésről nyújt információt.
|
PT_INTERP
|
3
|
A programfejléc megadja az értelmezőként futtatandó elérési út méretét és helyét (null végű C -stílusú karakterláncok). Ez a fajta szegmens csak végrehajtható fájlok esetén értelmezhető (bár lehet megosztott objektumfájlban is); nem fordulhat elő többször egy fájlban. Ha van ilyen típusú fejléc, annak meg kell előznie a betöltendő szegmens bármely programfejlécét.
|
PT_NOTE
|
négy
|
A programfejléc határozza meg a segédinformációk helyét és méretét.
|
PT_SHLIB
|
5
|
Ez a szegmenstípus le van foglalva, de jelentése nincs meghatározva. Az ilyen típusú programfejlécet tartalmazó programok nem felelnek meg az ABI-nak.
|
PT_PHDR
|
6
|
A programfejléc, ha van, megadja magának a programfejléc-táblázatnak a helyét és méretét, mind a fájlban, mind a program memóriaképében. Ez a szegmenstípus nem fordulhat elő többször egy fájlban. Sőt, csak akkor fordulhat elő, ha a fájlban van programfejléc tábla. Ha van ilyen típusú fejléc, annak meg kell előznie a betöltendő szegmens bármely programfejlécét.
|
PT_TLS
|
7
|
A program fejléce határozza meg a Thread-Local Storage mintát. Az ELF betöltőknek nem szabad megtartaniuk ezt a bejegyzést a programfejléc-táblázatban.
|
PT_LOOS-PT_HIOS
|
1610612736 - 1879048191
|
Operációs rendszertől függő értékek.
|
PT_LOPROC-PT_HIPROC
|
1879048192 - 2147483647
|
Processzor függő értékek.
|
|
|
négy
|
p_flags
|
Szegmenshez kapcsolódó jelzők (ELF64-hez).
Név
|
Jelentése
|
Leírás
|
PF_X
|
0x1
|
Engedély a végrehajtásra
|
PF_W
|
0x2
|
Írási engedély
|
PF_R
|
0x4
|
Olvasási engedély
|
PF_MASKOS
|
0x0ff00000
|
A mezőben szereplő összes bit operációs rendszertől függő értékeket határoz meg.
|
PF_MASKPROC
|
0xf0000000
|
A mezőben szereplő összes bit processzor-specifikus értékeket határoz meg.
|
|
négy
|
nyolc
|
p_offset
|
Szegmens eltolás a fájl elejétől.
|
négy
|
nyolc
|
p_vaddr
|
Annak a szegmensnek a virtuális címe a memóriában, ahová a szegmenst be kell tölteni, amikor a memóriába van leképezve.
|
négy
|
nyolc
|
p_paddr
|
A szegmens fizikai címe (olyan rendszerek esetében, ahol ez fontos).
|
négy
|
nyolc
|
p_filesz
|
A szegmens mérete a fájlban. Lehet nulla.
|
négy
|
nyolc
|
p_memsz
|
A szegmens mérete a memóriában. Lehet nulla.
|
négy
|
|
p_flags
|
Szegmenshez kapcsolódó jelzők (ELF32-hez) (a lehetséges értékeket lásd fent).
|
négy
|
nyolc
|
p_align
|
Szegmensigazítás. 0és 1meghatározza az igazítás hiányát. Ellenkező esetben egy bizonyos mértékig pozitív 2-nek kell lennie.
|
Szakaszfejléc táblázat
A szakaszfejléc táblázat tartalmazza a fájl szakasz attribútumait. Erre a táblára csak a linkernek van szüksége, a futtatható fájloknak nincs szüksége erre a táblára (az ELF betöltő figyelmen kívül hagyja). A szakaszfejléc-táblázatban megadott információkat a linker használja fel arra, hogy a fájl összeállítása során optimálisan szegmensekbe rendezze ezeket a szakaszokat, figyelembe véve azok attribútumait.
Szakaszfejléc mezők
A méret
|
Név
|
Célja
|
MANÓ
32
|
MANÓ
64
|
négy
|
sh_name
|
A szakasz nevét tartalmazó sor eltolása a szakasznevek táblázatának elejéhez képest.
|
négy
|
sh_type
|
Fejléc típusa.
Név
|
Jelentése
|
Leírás
|
SHT_NULL
|
0
|
A cím nincs felhasználva, a többi mező nincs megadva.
|
SHT_PROGBITS
|
egy
|
A rész a program által meghatározott információkat tartalmaz, formátumát és jelentését egyedül a program határozza meg.
|
SHT_SYMTAB
|
2
|
A szakasz a szimbólumtáblázatot tartalmazza. Egy fájlban jelenleg csak egy ilyen szakasz lehet.
|
SHT_STRTAB
|
3
|
A szakasz egy karakterlánc-táblázatot tartalmaz. Egy fájl több ilyen típusú szakaszt tartalmazhat.
|
SHT_RELA
|
négy
|
A szakasz részletes információkat tartalmaz a mozgásokról. Egy fájl több ilyen típusú szakaszt tartalmazhat.
|
SHT_HASH
|
5
|
A szakasz egy szimbólum hash táblázatot tartalmaz. Egy fájlban jelenleg csak egy ilyen szakasz lehet.
|
SHT_DYNAMIC
|
6
|
A szakasz a dinamikus linkelésről tartalmaz információkat. Egy fájlban jelenleg csak egy ilyen szakasz lehet.
|
SHT_NOTE
|
7
|
A szakasz olyan információkat tartalmaz, amelyek valamilyen módon megjelölik a fájlt.
|
SHT_NOBITS
|
nyolc
|
A szakasz nem foglal helyet a fájlban, különben hasonló a fájlhoz SHT_PROGBITS.
|
SHT_REL
|
9
|
A rész a mozgásokról tartalmaz információkat. Egy fájl több ilyen típusú szakaszt tartalmazhat.
|
SHT_SHLIB
|
tíz
|
Ez a szakasztípus meghatározott, de nincs konkrét jelentése.
|
SHT_DYNSYM
|
tizenegy
|
A szakasz a szimbólumtáblázatot tartalmazza. Egy fájlban jelenleg csak egy ilyen szakasz lehet.
|
SHT_INIT_ARRAY
|
tizennégy
|
A szakasz a program inicializálási függvényeire mutató mutatók tömbjét tartalmazza. A függvények nem vehetnek fel argumentumot, és nem adhatnak vissza semmit.
|
SHT_FINI_ARRAY
|
tizenöt
|
Ez a szakasz egy sor mutatót tartalmaz a programzáró függvényekre. A függvények nem vehetnek fel argumentumot, és nem adhatnak vissza semmit.
|
SHT_PREINIT_ARRAY
|
16
|
A szakasz mutatók tömbjét tartalmazza olyan függvényekre, amelyeket a program inicializálási függvényeinek meghívása előtt hívnak meg. A függvények nem vehetnek fel argumentumot, és nem adhatnak vissza semmit.
|
SHT_GROUP
|
17
|
Ez a szakasz szakaszok csoportját határozza meg. A szakaszcsoport olyan kapcsolódó szakaszok gyűjteménye, amelyeket a linkernek speciális módon kell kezelnie. Az ilyen szakaszok csak áthelyezhető objektumfájlokban lehetnek (amelynek mezője e_typea értékű ET_REL). A szakaszok csoportját meghatározó címsornak a szakasztáblázatban a definiálandó csoportban szereplő összes szakasz fejléce előtt kell lennie.
|
SHT_SYMTAB_SHNDX
|
tizennyolc
|
Egy szakasz egy szimbólumtáblázathoz van társítva, és akkor szükséges, ha a táblázat bármely eleme olyan szakaszfejlécre hivatkozik, amely indexel rendelkezik SHN_XINDEX(ez akkor történik, ha a szakaszindex olyan nagy, hogy nem fér el a mezőben st_shndx). Elf32_WordA szakasz ELF32 és ELF64 típusú számok tömbjét tartalmazza Elf64_Word. Ennek a tömbnek minden eleme megfelel egy bejegyzésnek a szimbólumtáblázatban, és a megfelelő sorrendbe kerül. Ezek az elemek azon szakaszcímsorok indexei, amelyekhez a megfelelő szimbólumok vannak társítva. Ha a st_shndxszimbólumtábla megfelelő elemének mezőjének értéke SHN_XINDEX, akkor az elem tartalmazza a valós szakaszfejléc indexet, ellenkező esetben az elem tartalmazza a -t 0.
|
SHT_LOOS-SHT_HIOS
|
1610612736 - 1879048191
|
Operációs rendszertől függő értékek.
|
SHT_LOPROC-SHT_HIPROC
|
1879048192 - 2147483647
|
Processzor függő értékek.
|
SHT_LOUSER-SHT_HIUSER
|
2147483648 - 4294967295
|
Programfüggő értékek. Ezeket az értékeket az ELF formátumú fájlkezelők használhatják anélkül, hogy ütköznének az aktuálisan meghatározott értékekkel.
|
|
négy
|
nyolc
|
sh_flags
|
szakasz attribútumait.
Név
|
Jelentése
|
Leírás
|
SHF_WRITE
|
0x1
|
Írási engedély.
|
SHF_ALLOC
|
0x2
|
A szakasz memóriát foglal a folyamat futása közben. Egyes szolgáltatási szakaszok nem töltődnek be a memóriába egy objektumfájl betöltésekor; ilyen szakaszok esetében ez a jelző le van tiltva.
|
SHF_EXECINSTR
|
0x4
|
A szakasz végrehajtható gépi utasításokat tartalmaz.
|
SHF_MERGE
|
0x10
|
A partíción lévő adatok kombinálhatók a duplikáció kiküszöbölése érdekében. Ha a zászló SHF_STRINGSnincs beállítva, akkor a szakasz adatelemei azonos méretűek. Egy elem mérete a mezőben látható sh_entsize. Ha a jelző SHF_STRINGSbe van állítva, a szakasz null-végű karakterek tömbjéből áll, és egy karakter mérete a mezőben van megadva sh_entsize.
A szakasz minden elemét összehasonlítja az azonos nevű, típusú és zászlókkal rendelkező szakaszok többi elemével. A program végrehajtása során azonos értékű elemek kombinálhatók. Az ilyen szekciók tagjaira vonatkozó lépéseket ennek megfelelően kell megoldani. Egyesítés előtt a szakasz összes elemét elemezni kell, hogy meghatározzuk, hogy az értékek ténylegesen azonosak lesznek-e a futásidőben.
Ez a társítás nem feltétele az ABI-megfelelésnek.
|
SHF_STRINGS
|
0x20
|
Egy szakasz null-végű karakterek tömbjéből áll. Egy karakter mérete a mezőben van megadva sh_entsize.
|
SHF_INFO_LINK
|
0x40
|
A szakaszfejléc mező sh_infotartalmazza a szakaszfejléc táblázat bejegyzésének indexét.
|
SHF_LINK_ORDER
|
0x80
|
Különleges elhelyezési követelmények. A követelmények akkor érvényesek, ha a sh_linkszakaszfejléc mező egy másik szakaszra (kapcsolódó szakaszra) hivatkozik. Ha a sh_linkcsatolt szakasz mezője nem tartalmazza 0a -t, akkor az aktuális szakasznak a kimeneti fájlban kell lennie a hivatkozott szakaszhoz képest abban a sorrendben, ahogyan a hivatkozott szakasz ahhoz a szakaszhoz képest, amelyhez kapcsolódik.
|
SHF_OS_NONCONFORMING
|
0x100
|
A szakasz speciális, operációs rendszer-specifikus kezelést igényel a helytelen viselkedés elkerülése érdekében.
|
SHF_GROUP
|
0x200
|
Szakasz – szakaszok csoportjának egy eleme (talán az egyetlen).
|
SHF_TLS
|
0x400
|
A szakasz Thread-Local Storage-t tartalmaz, minden szálnak megvan a saját másolata ebből a szakaszból.
|
SHF_COMPRESSED
|
0x800
|
A szakasz tömörített adatokat tartalmaz. Ez a jelző csak azokra a szakaszokra vonatkozik, amelyekhez nincs memória lefoglalva, amikor objektumfájlt tölt be a memóriába. A zászlót nem használják együtt a -val SHF_ALLOC. Ez a jelző szintén nem vonatkozik a típusú szakaszokra SHT_NOBITS.
A tömörített szakaszhoz kapcsolódó összes mozgás annak tömörítetlen állapotban lévő adataira vonatkozik. Ezért a szakaszok dekompressziója szükséges a mozgás lehetővé tételéhez. Minden tömörített szakasz meghatározza a saját tömörítési algoritmusát. Elfogadható, hogy egy ELF objektumfájl különböző szakaszai különböző tömörítési algoritmusokat használnak.
A tömörített szakaszok a tömörítési algoritmust azonosító fejléccel kezdődnek.
Tömörített szakaszfejlécek
A méret
|
Név
|
Célja
|
MANÓ
32
|
MANÓ
64
|
négy
|
négy
|
ch_type
|
tömörítési algoritmus.
Név
|
Jelentése
|
Leírás
|
ELFCOMPRESS_ZLIB
|
egy
|
A szakasz adatait a Zlib algoritmussal tömörítjük . A tömörített adatok közvetlenül a fejléc után és a szakasz vége előtt következnek.
|
ELFCOMPRESS_LOOS-ELFCOMPRESS_HIOS
|
1610612736 - 1879048191
|
Operációs rendszertől függő értékek.
|
ELFCOMPRESS_LOPROC-ELFCOMPRESS_HIPROC
|
1879048192 - 2147483647
|
Processzor függő értékek.
|
|
|
négy
|
ch_reserved
|
Fenntartva későbbi használatra.
|
négy
|
nyolc
|
ch_size
|
A kicsomagolt szakasz mérete bájtban.
|
négy
|
nyolc
|
ch_addralign
|
Szükséges igazítás a tömörített szakaszhoz.
|
|
SHF_MASKOS
|
0x0ff00000
|
A mezőben szereplő összes bit operációs rendszertől függő értékeket határoz meg.
|
SHF_MASKPROC
|
0xf0000000
|
A mezőben szereplő összes bit processzor-specifikus értékeket határoz meg.
|
|
négy
|
nyolc
|
sh_addr
|
Ha a szakaszt be kell tölteni a memóriába az objektumfájl betöltésekor, ez a mező azt a címet adja meg, ahonnan a szakasz betöltődik, ellenkező esetben a mező tartalmazza: 0.
|
négy
|
nyolc
|
sh_offset
|
A szakasz eltolása a fájl elejétől bájtban. A típusszakaszok SHT_NOBITSnem foglalnak helyet a fájlban, számukra ez a mező tartalmazza a fogalmi helyet a fájlban.
|
négy
|
nyolc
|
sh_size
|
A szakasz mérete a fájlban. Lehet nulla.
|
négy
|
sh_link
|
A kapcsolódó szakasz indexe. Ennek a mezőnek a fejléc típusától függően különböző céljai lehetnek.
A mezők értelmezése sh_linkés sh_infoa mező értékétől függőensh_type
sh_type
|
sh_link
|
sh_info
|
SHT_DYNAMIC
|
A karakterlánc-tábla szakaszfejlécének indexe, amelyet a szakasz elemei használnak.
|
0
|
SHT_HASH
|
A szimbólumtábla szekció fejlécének indexe, amelyhez ez a hash tábla tartozik.
|
0
|
SHT_REL,SHT_RELA
|
A kapcsolódó szimbólumtábla szakaszfejléc-indexe.
|
A szakaszfejléc indexe, amelyre az áthelyezési adatokat alkalmazni kell.
|
SHT_SYMTAB,SHT_DYNSYM
|
A kapcsolódó karakterlánc-tábla szakaszfejlécének indexe.
|
Eggyel több, mint az utolsó helyi szimbólum ( STB_LOCAL) indexe a szimbólumtáblázatban.
|
SHT_GROUP
|
A kapcsolódó szimbólumtábla szakaszfejléc-indexe.
|
Az elem indexe a kapcsolódó szimbólumtáblázatban. A megadott elem neve adja a szakaszcsoport aláírását.
|
SHT_SYMTAB_SHNDX
|
A kapcsolódó szimbólumtábla szakasz szakaszfejléc-indexe.
|
0
|
|
négy
|
sh_info
|
További információk a szakaszról (a lehetséges értékeket lásd fent).
|
négy
|
nyolc
|
sh_addralign
|
Szükséges szakaszigazítás.
|
négy
|
nyolc
|
sh_entsize
|
Az egyes bejegyzések mérete bájtban (ha a szakasz rögzített méretű bejegyzések tömbjét tartalmazza, ellenkező esetben a mező tartalmazza a -t 0).
|
A szakaszok és szegmensek tartalma
Segédprogramok
Számos segédprogram létezik az ELF fájlokkal való munkavégzéshez, a főbbeket a GNU Binutils szoftver eszközkészlete tartalmazza :
- elfedit - ELF fájl fejléc módosítása, a GNU Binutils programcsomag része.
- objdump - információ kiadása az objektumfájlokról (beleértve az ELF-et is), a GNU Binutils készlet része.
- readelf - Részletes információkat jelenít meg egy objektumfájlról ELF formátumban, amely a GNU Binutils programcsomag része.
- elfdump- információk megjelenítése az ELF fájlról, amely a GNU Binutils programcsomag része.
- elfutilsa GNU Binutils alternatívája, hivatalosan csak GNU/Linuxhoz érhető el , de vannak portok más operációs rendszerekhez [4] .
- file- kis mennyiségű információt ad ki a program által ismert formátumú fájlokról (elérhető a legtöbb UNIX-szerű operációs rendszerhez ).
Lásd még
Jegyzetek
- ↑ System V Application Binary Interface archiválva 2015. május 21-én a Wayback Machine Edition 4.1-es verziójában (1997-03-18 )
- ↑ Az ELF specifikáció archiválva : 2012. június 16. a Wayback Machine -nél
- ↑ ELF-64 objektumfájl formátum archiválva : 2015. július 1. a Wayback Machine -nél
- ↑ FreshPorts -- devel/elfutils . www.freshports.org. Letöltve: 2018. március 31. Az eredetiből archiválva : 2018. február 16. (határozatlan)
Linkek