Spustitelný a propojitelný formát
Aktuální verze stránky ještě nebyla zkontrolována zkušenými přispěvateli a může se výrazně lišit od
verze recenzované 7. června 2021; kontroly vyžadují
6 úprav .
ELF ( anglicky Executable and Linkable Format - spustitelný a propojitelný souborový formát) je binární formát souboru používaný v mnoha moderních operačních systémech podobných UNIX , jako je FreeBSD , Linux , Solaris atd.
Historie
Standard formátu ELF byl původně vyvinut a publikován společností jako součást binárního aplikačního rozhraní UNIX System V [1] . Poté byl vybrán výborem a vyvinut jako přenosný formát pro různé operační systémy běžící na 32bitové hardwarové architektuře Intel x86 . [2] ELF si rychle získal popularitu a poté, co společnost HP rozšířila formát a vydala standard ELF-64, se rozšířila na 64bitové platformy. [3]
Typy
Standard formátu ELF rozlišuje několik typů souborů:
- Přemístitelný soubor – ukládá instrukce a data, která lze propojit s jinými soubory objektů . Výsledkem takového odkazu může být sdílený objektový soubor nebo spustitelný soubor. Tento typ zahrnuje objektové soubory statických knihoven.
- Sdílený objektový soubor - obsahuje také instrukce a data a může být spojen s jinými přemístitelnými soubory a sdílenými objektovými soubory, v důsledku čehož bude vytvořen nový objektový soubor, nebo když je program spuštěn ke spuštění, operační systém může dynamicky asociovat to se spustitelným souborem programu, v důsledku čehož se vytvoří spustitelný obraz programu. V druhém případě mluvíme o sdílených knihovnách.
- Spustitelný soubor – obsahuje úplný popis, který umožňuje systému vytvořit obraz procesu . Včetně: pokynů, dat, popisu požadovaných souborů sdílených objektů a nezbytných symbolických a ladicích informací.
Formát
Každý soubor ELF se skládá z následujících částí:
Záhlaví souboru
Záhlaví souboru (ELF Header) má pevné umístění na začátku souboru a obsahuje obecný popis struktury souboru a jeho hlavních charakteristik, jako jsou: typ, verze formátu, architektura procesoru , adresa virtuálního vstupního bodu , velikosti a offsety. dalších částí souboru. Hlavička je 52 bajtů pro 32bitové soubory nebo 64 pro 64bitové soubory . Tento rozdíl je způsoben tím, že hlavička souboru obsahuje tři pole s velikostí ukazatele, která je 4 a 8 bajtů pro 32bitové a 64bitové procesory . Tato pole jsou e_entry, e_phoffa e_shoff.
Pole záhlaví souboru ELF
Velikost
|
název |
Účel
|
ELF
32
|
ELF
64
|
16
|
e_ident[16] |
Obecná charakteristika souboru.
Pole bajtůe_ident
Index
|
název
|
Účel
|
0:3
|
EI_MAG0-EI_MAG3
|
Podpis souboru: 0x7f 0x45 0x4c 0x46.
|
čtyři
|
EI_CLASS
|
Třída objektového souboru.
název
|
Význam
|
Popis
|
ELFCLASSNONE
|
0
|
Nesprávná třída
|
ELFCLASS32
|
jeden
|
32bitový objektový soubor
|
ELFCLASS64
|
2
|
64bitový objektový soubor
|
|
5
|
EI_DATA
|
Metoda kódování dat závislá na procesoru.
|
6
|
EI_VERSION
|
Verze hlavičky ELF. Aktuálně by hodnota tohoto bajtu měla být EV_CURRENT.
název
|
Význam
|
EV_CURRENT
|
jeden
|
|
7
|
EI_OSABI
|
Operační systém nebo přípony specifické pro ABI použité v souboru. Některá pole v jiných strukturách souborů ELF mají příznaky a pole, jejichž význam závisí na operačním systému nebo ABI; interpretace těchto polí je určena hodnotou daného bytu. Pokud soubor objektu nepoužívá přípony, doporučuje se, aby byl tento bajt nastaven na 0. Pokud je hodnota tohoto bajtu v rozsahu od 64do 255, pak jeho interpretace závisí na hodnotě pole hlavičky e_machine ELF. V tomto rozsahu může každá architektura definovat vlastní sadu hodnot.
název
|
Význam
|
Popis
|
ELFOSABI_NONE
|
0
|
UNIX Systém V ABI
|
ELFOSABI_HPUX
|
jeden
|
HP-UX
|
ELFOSABI_NETBSD
|
2
|
NetBSD
|
ELFOSABI_GNU
|
3
|
Soubor používá přípony GNU ELF ( GNU/Linux )
|
ELFOSABI_SOLARIS
|
6
|
Solaris
|
ELFOSABI_AIX
|
7
|
AIX
|
ELFOSABI_IRIX
|
osm
|
IRIX
|
ELFOSABI_FREEBSD
|
9
|
FreeBSD
|
ELFOSABI_TRU64
|
deset
|
Tru64 UNIX
|
ELFOSABI_MODESTO
|
jedenáct
|
Modesto
|
ELFOSABI_OPENBSD
|
12
|
OpenBSD
|
ELFOSABI_OPENVMS
|
13
|
openvms
|
ELFOSABI_NSK
|
čtrnáct
|
Non Stop jádro
|
ELFOSABI_AROS
|
patnáct
|
OS Amiga Research
|
ELFOSABI_FENIXOS
|
16
|
fenixOS
|
ELFOSABI_CLOUDABI
|
17
|
CloudABI
|
ELFOSABI_OPENVOS
|
osmnáct
|
OpenVOS
|
|
64–255
|
Hodnoty závislé na procesoru
|
|
osm
|
EI_ABIVERSION
|
Verze ABI.
|
9
|
EI_PAD
|
T. n. vycpávkové bajty (vycpávka). Prvky pole vyhrazené pro budoucí použití e_ident. Obvykle se instaluje v 0. Čtenáři objektových souborů by je měli ignorovat.
|
deset
|
EI_PAD + 1
|
jedenáct
|
EI_PAD + 2
|
12
|
EI_PAD + 3
|
13
|
EI_PAD + 4
|
čtrnáct
|
EI_PAD + 5
|
patnáct
|
EI_PAD + 6
|
|
2
|
e_type |
Typ souboru.
název
|
Význam
|
Popis
|
ET_NONE
|
0
|
Nejistý
|
ET_REL
|
jeden
|
Soubor se přesouvá
|
ET_EXEC
|
2
|
Spustitelný
|
ET_DYN
|
3
|
Soubor sdíleného objektu
|
ET_CORE
|
čtyři
|
základní soubor
|
ET_LOOS-ET_HIOS
|
65024–65279
|
Hodnoty závislé na operačním systému
|
ET_LOPROC-ET_HIPROC
|
65280–65535
|
Hodnoty závislé na procesoru
|
|
2
|
e_machine |
Architektura hardwarové platformy, pro kterou byl soubor vytvořen:
název
|
Význam
|
Popis
|
EM_NONE
|
0x0
|
Nedefinováno
|
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 |
Rezervováno pro budoucí použití
|
EM_PARISC
|
0x0F |
Hewlett-Packard PA-RISC
|
|
0x10 |
Rezervováno pro budoucí použití
|
EM_960
|
0x13 |
Intel 80960
|
EM_PPC
|
0x14
|
PowerPC
|
EM_PPC64
|
0x15
|
PowerPC (64bitový)
|
EM_S390
|
0x16 |
S390 včetně S390x
|
EM_SPU
|
0x17 |
IBM SPU/SPC
|
|
0x18 - 0x23 |
Rezervováno pro budoucí použití
|
EM_V800
|
0x24 |
NEC V800
|
EM_FR20
|
0x25 |
Fujitsu FR20
|
EM_RH32
|
0x26 |
TRW RH-32
|
EM_MCOREaEM_RCE
|
0x27 |
Motorola RCE
|
EM_ARM
|
0x28 |
ARM (až ARMv7/Aarch32)
|
EM_OLD_ALPHA
|
0x29 |
Digitální alfa
|
EM_SH
|
0x2A |
superh
|
EM_SPARCV9
|
0x2B |
SPARC verze 9
|
EM_TRICORE
|
0x2C |
Vestavěný procesor Siemens TriCore
|
EM_ARC
|
0x2D |
Jádro Argonaut RISC
|
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 |
Multimediální akcelerátor Fujitsu MMA
|
EM_PCP
|
0x37 |
Siemens PCP
|
EM_NCPU
|
0x38 |
Vestavěný RISC procesor Sony nCPU
|
EM_NDR1
|
0x39 |
Mikroprocesor Denso NDR1
|
EM_STARCORE
|
0x3A |
Procesor Motorola Star*Core
|
EM_ME16
|
0x3B |
Procesor Toyota ME16
|
EM_ST100
|
0x3C |
Procesor STMicroelectronics ST100
|
EM_TINYJ
|
0x3D |
Advanced Logic Corp. Rodina vestavěných procesorů TinyJ
|
EM_X86_64
|
0x3E
|
AMD x86-64
|
EM_MCST_ELBRUS
|
0xAF
|
Elbrus (architektura procesoru)
|
EM_TI_C6000
|
0x8C |
Rodina TMS320C6000
|
EM_AARCH64
|
0xB7 |
ARM 64bitový (ARMv8/Aarch64)
|
EM_RISCV
|
0xF3 |
RISC-V
|
EM_BPF
|
0xF7 |
Paketový filtr Berkeley
|
EM_65816
|
0x101
|
WDC 65C816
|
|
čtyři
|
e_version |
Číslo verze formátu. V tuto chvíli je za správnou považována pouze jedna hodnota.
název
|
Význam
|
Popis
|
EV_NONE
|
0
|
Nesprávná hodnota
|
EV_CURRENT
|
jeden
|
Současná verze
|
|
čtyři
|
osm
|
e_entry |
Virtuální adresa vstupního bodu, kterému systém předá řízení při spuštění procesu. Pokud soubor nemá vstupní bod, toto pole obsahuje 0.
|
čtyři
|
osm
|
e_phoff |
Posun tabulky záhlaví programu od začátku souboru v bajtech. Pokud soubor nemá tabulku záhlaví programu, toto pole obsahuje 0.
|
čtyři
|
osm
|
e_shoff |
Odsazení tabulky záhlaví oddílu od začátku souboru v bajtech. Pokud soubor nemá tabulku záhlaví oddílu, toto pole obsahuje 0.
|
čtyři
|
e_flags |
Příznaky specifické pro procesor přidružené k souboru . Pokud chybí, toto pole obsahuje 0.
|
2
|
e_ehsize |
Velikost záhlaví souboru v bajtech ( 52pro 32bitové a 6464bitové soubory).
|
2
|
e_phentsize |
Velikost jedné hlavičky programu. Všechny hlavičky programů mají stejnou velikost ( 32pro 32bitové soubory a 56pro 64bitové).
|
2
|
e_phnum |
Počet hlaviček programů. Pokud soubor nemá tabulku záhlaví programu, toto pole obsahuje 0.
|
2
|
e_shentsize |
Velikost jednoho záhlaví sekce. Všechna záhlaví sekcí mají stejnou velikost ( 40pro 32bitové soubory a 64pro 64bitové soubory).
|
2
|
e_shnum |
Počet záhlaví sekcí. Pokud soubor nemá tabulku záhlaví oddílu, toto pole obsahuje 0.
|
2
|
e_shstrndx |
Index záznamu v tabulce záhlaví sekcí, který popisuje tabulku názvů sekcí (obvykle se tato tabulka nazývá .shstrtab a představuje samostatnou sekci). Pokud soubor neobsahuje tabulku názvů oddílů, toto pole obsahuje 0.
|
Tabulka záhlaví programu
Tabulka hlaviček programu obsahuje hlavičky, z nichž každá popisuje samostatný segment programu a jeho atributy nebo další informace potřebné pro operační systém k přípravě programu ke spuštění. Tato tabulka může být umístěna kdekoli v souboru, její umístění (offset vzhledem k začátku souboru) je popsáno v poli e_phoffhlavičky ELF.
Při analýze struktury záhlaví programu lze najít různá umístění polí p_flagspro 32bitové a 64bitové soubory ELF. Tento rozdíl je způsoben zarovnáním struktury za účelem zvýšení efektivity zpracování.
Pole záhlaví programu
Velikost
|
název
|
Účel
|
ELF
32
|
ELF
64
|
čtyři
|
p_type
|
Typ segmentu, který toto záhlaví popisuje, nebo jak interpretovat hodnoty pole tohoto záhlaví.
název
|
Význam
|
Popis
|
PT_NULL
|
0
|
Titulek není použit, ostatní pole nejsou definována. Tento typ umožňuje zahrnout ignorované prvky do tabulky záhlaví programu souboru.
|
PT_LOAD
|
jeden
|
Segment, který se má načíst, popsaný pomocí polí p_filesza p_memsz. Bajty ze souboru jsou mapovány na segment v paměti. Pokud je velikost segmentu paměti ( p_memsz) větší než velikost segmentu souboru ( p_filesz), jsou bajty navíc doplněny nulami (bezprostředně následují bajty definované v segmentu). Velikost segmentu v souboru ( p_filesz) nemůže být větší než velikost segmentu v paměti ( p_memsz). Názvy programů segmentů ke stažení jsou uspořádány v tabulce názvů programů ve vzestupném pořadí podle hodnoty pole p_vaddr.
|
PT_DYNAMIC
|
2
|
Záhlaví programu poskytuje informace o dynamickém propojování.
|
PT_INTERP
|
3
|
Hlavička programu poskytuje velikost a umístění cesty ( řetězce ve stylu C zakončené nulou), která se má spustit jako interpret. Tento typ segmentu má smysl pouze pro spustitelné soubory (ačkoli může být také v souboru sdíleného objektu); v souboru se nemůže vyskytovat více než jednou. Pokud je přítomno záhlaví tohoto typu, musí předcházet jakékoli záhlaví programu načítaného segmentu.
|
PT_NOTE
|
čtyři
|
Hlavička programu definuje umístění a velikost pomocných informací.
|
PT_SHLIB
|
5
|
Tento typ segmentu je vyhrazen, ale jeho význam není definován. Programy obsahující hlavičku programu tohoto typu nevyhovují ABI.
|
PT_PHDR
|
6
|
Záhlaví programu, pokud je přítomno, určuje umístění a velikost samotné tabulky záhlaví programu, a to jak v souboru, tak v obrazu paměti programu. Tento typ segmentu se v souboru nemůže vyskytovat více než jednou. Navíc k němu může dojít pouze v případě, že soubor obsahuje tabulku záhlaví programu. Pokud je přítomno záhlaví tohoto typu, musí předcházet jakékoli záhlaví programu načítaného segmentu.
|
PT_TLS
|
7
|
Záhlaví programu definuje vzor Thread-Local Storage. Zavaděče ELF nesmí udržovat tuto položku v tabulce záhlaví programu.
|
PT_LOOS-PT_HIOS
|
1610612736 – 1879048191
|
Hodnoty závislé na operačním systému.
|
PT_LOPROC-PT_HIPROC
|
1879048192 – 2147483647
|
Hodnoty závislé na procesoru.
|
|
|
čtyři
|
p_flags
|
Příznaky související se segmenty (pro ELF64).
název
|
Význam
|
Popis
|
PF_X
|
0x1
|
Povolení k provedení
|
PF_W
|
0x2
|
Povolení k zápisu
|
PF_R
|
0x4
|
Oprávnění ke čtení
|
PF_MASKOS
|
0x0ff00000
|
Všechny bity zahrnuté v tomto poli definují hodnoty závislé na operačním systému.
|
PF_MASKPROC
|
0xf0000000
|
Všechny bity zahrnuté v tomto poli definují hodnoty specifické pro procesor.
|
|
čtyři
|
osm
|
p_offset
|
Odsazení segmentu od začátku souboru.
|
čtyři
|
osm
|
p_vaddr
|
Virtuální adresa segmentu v paměti, kam má být segment načten při mapování do paměti.
|
čtyři
|
osm
|
p_paddr
|
Fyzická adresa segmentu (pro systémy, kde je to důležité).
|
čtyři
|
osm
|
p_filesz
|
Velikost segmentu v souboru. Může být nulový.
|
čtyři
|
osm
|
p_memsz
|
Velikost segmentu v paměti. Může být nulový.
|
čtyři
|
|
p_flags
|
Příznaky související se segmenty (pro ELF32) (možné hodnoty viz výše).
|
čtyři
|
osm
|
p_align
|
Zarovnání segmentu. 0a 1určit nedostatek zarovnání. Jinak musí být do určité míry kladná 2.
|
Tabulka záhlaví sekce
Tabulka záhlaví sekce obsahuje atributy sekce souboru. Tuto tabulku potřebuje pouze linker, spustitelné soubory tuto tabulku nepotřebují (zavaděč ELF ji ignoruje). Informace uvedené v tabulce záhlaví sekcí používá linker k optimálnímu uspořádání těchto sekcí do segmentů při kompilaci souboru s přihlédnutím k jejich atributům.
Pole záhlaví sekce
Velikost
|
název
|
Účel
|
ELF
32
|
ELF
64
|
čtyři
|
sh_name
|
Odsazení řádku obsahujícího název tohoto oddílu vzhledem k začátku tabulky názvů oddílů.
|
čtyři
|
sh_type
|
Typ záhlaví.
název
|
Význam
|
Popis
|
SHT_NULL
|
0
|
Titulek není použit, ostatní pole nejsou definována.
|
SHT_PROGBITS
|
jeden
|
Sekce obsahuje informace definované programem, její formát a význam určuje pouze program.
|
SHT_SYMTAB
|
2
|
Sekce obsahuje tabulku symbolů. V současné době může být v souboru pouze jeden takový oddíl.
|
SHT_STRTAB
|
3
|
Sekce obsahuje tabulku řetězců. Soubor může mít mnoho sekcí tohoto typu.
|
SHT_RELA
|
čtyři
|
Sekce obsahuje rozšířené informace o pohybech. Soubor může mít mnoho sekcí tohoto typu.
|
SHT_HASH
|
5
|
Sekce obsahuje hašovací tabulku symbolů. V současné době může být v souboru pouze jeden takový oddíl.
|
SHT_DYNAMIC
|
6
|
Sekce obsahuje informace o dynamickém propojování. V současné době může být v souboru pouze jeden takový oddíl.
|
SHT_NOTE
|
7
|
Sekce obsahuje informace, které soubor nějakým způsobem označují.
|
SHT_NOBITS
|
osm
|
Sekce nezabírá v souboru žádné místo, jinak je podobná SHT_PROGBITS.
|
SHT_REL
|
9
|
Sekce obsahuje informace o pohybech. Soubor může mít mnoho sekcí tohoto typu.
|
SHT_SHLIB
|
deset
|
Tento typ sekce je definován, ale nemá žádný konkrétní význam.
|
SHT_DYNSYM
|
jedenáct
|
Sekce obsahuje tabulku symbolů. V současné době může být v souboru pouze jeden takový oddíl.
|
SHT_INIT_ARRAY
|
čtrnáct
|
Sekce obsahuje pole ukazatelů na funkce inicializace programu. Funkce nesmí přijímat žádné argumenty a nic vracet.
|
SHT_FINI_ARRAY
|
patnáct
|
Sekce obsahuje pole ukazatelů na funkce finalizace programu. Funkce nesmí přijímat žádné argumenty a nic vracet.
|
SHT_PREINIT_ARRAY
|
16
|
Sekce obsahuje pole ukazatelů na funkce, které jsou volány před voláním funkcí inicializace programu. Funkce nesmí přijímat žádné argumenty a nic vracet.
|
SHT_GROUP
|
17
|
Tato sekce definuje skupinu sekcí. Skupina sekcí je kolekce souvisejících sekcí, se kterými musí linker zacházet zvláštním způsobem. Takové sekce mohou být pouze v přemístitelných objektových souborech (jejichž pole e_typemá hodnotu ET_REL). Nadpis, který definuje skupinu sekcí, musí být v tabulce sekcí před nadpisy všech sekcí obsažených v definované skupině.
|
SHT_SYMTAB_SHNDX
|
osmnáct
|
Sekce je spojena s tabulkou symbolů a je nezbytná, pokud jakýkoli prvek této tabulky odkazuje na záhlaví sekce, která má index SHN_XINDEX(k tomu dochází, pokud je index sekce tak velký, že se nevejde do pole st_shndx). Sekce obsahuje pole čísel typu Elf32_Wordpro ELF32 a Elf64_Wordpro ELF64. Každý prvek tohoto pole odpovídá položce v tabulce symbolů a je umístěn v odpovídajícím pořadí. Tyto prvky jsou indexy nadpisů sekcí, ke kterým jsou přiřazeny odpovídající symboly. Pokud je hodnota pole st_shndxodpovídajícího prvku tabulky symbolů SHN_XINDEX, prvek obsahuje skutečný index záhlaví sekce, v opačném případě prvek obsahuje 0.
|
SHT_LOOS-SHT_HIOS
|
1610612736 – 1879048191
|
Hodnoty závislé na operačním systému.
|
SHT_LOPROC-SHT_HIPROC
|
1879048192 – 2147483647
|
Hodnoty závislé na procesoru.
|
SHT_LOUSER-SHT_HIUSER
|
2147483648 – 4294967295
|
Hodnoty závislé na programu. Tyto hodnoty mohou být použity obslužnými nástroji souborů formátu ELF bez konfliktu s aktuálně definovanými hodnotami.
|
|
čtyři
|
osm
|
sh_flags
|
atributy sekce.
název
|
Význam
|
Popis
|
SHF_WRITE
|
0x1
|
Povolení k zápisu.
|
SHF_ALLOC
|
0x2
|
Sekce zabírá paměť, zatímco proces běží. Některé sekce služby se při načítání souboru objektu nenačtou do paměti; pro takové sekce je tento příznak zakázán.
|
SHF_EXECINSTR
|
0x4
|
Sekce obsahuje spustitelné strojové instrukce.
|
SHF_MERGE
|
0x10
|
Data v oddílu lze kombinovat, aby se eliminovala duplicita. Pokud příznak SHF_STRINGSnení nastaven, mají datové prvky v sekci stejnou velikost. Velikost jednoho prvku je uvedena v poli sh_entsize. Pokud je nastaven příznak SHF_STRINGS, sekce se skládá z polí znaků zakončených nulou a velikost jednoho znaku je určena v poli sh_entsize.
Každý prvek v sekci je porovnáván s ostatními prvky v sekcích se stejným názvem, typem a příznaky. Prvky, které budou mít při provádění programu stejnou hodnotu, lze kombinovat. Tahy týkající se členů takových sekcí musí být odpovídajícím způsobem vyřešeny. Před sloučením musí být všechny prvky sekce analyzovány, aby se zjistilo, zda budou hodnoty za běhu efektivně identické.
Toto přidružení není podmínkou pro shodu s ABI.
|
SHF_STRINGS
|
0x20
|
Sekce se skládá z polí znaků zakončených nulou. Velikost jednoho znaku je uvedena v poli sh_entsize.
|
SHF_INFO_LINK
|
0x40
|
Pole záhlaví sekce sh_infoobsahuje index záznamu tabulky záhlaví sekce.
|
SHF_LINK_ORDER
|
0x80
|
Zvláštní požadavky na umístění. Požadavky platí, pokud sh_linkpole záhlaví oddílu odkazuje na jiný oddíl (související oddíl). Pokud pole sh_linkpropojené sekce neobsahuje 0, musí být aktuální sekce ve výstupním souboru ve stejném pořadí vzhledem k propojené sekci, v jakém je propojená sekce vzhledem k sekci, ke které je připojena.
|
SHF_OS_NONCONFORMING
|
0x100
|
Sekce vyžaduje speciální zacházení specifické pro operační systém, aby se zabránilo nesprávnému chování.
|
SHF_GROUP
|
0x200
|
Sekce - prvek (možná jediný) ze skupiny sekcí
|
SHF_TLS
|
0x400
|
Sekce obsahuje Thread-Local Storage, každé vlákno bude mít svou vlastní kopii této sekce.
|
SHF_COMPRESSED
|
0x800
|
Sekce obsahuje komprimovaná data. Tento příznak se vztahuje pouze na sekce, pro které není při načítání souboru objektu do paměti alokována paměť. Příznak se nepoužívá v kombinaci s SHF_ALLOC. Tento příznak také neplatí pro sekce typu SHT_NOBITS.
Všechny pohyby související s komprimovaným úsekem odkazují na jeho data v nekomprimovaném stavu. Proto je pro umožnění pohybu nutná dekomprese sekce. Každá komprimovaná sekce definuje svůj vlastní kompresní algoritmus. Pro různé sekce v souboru objektu ELF je přijatelné používat různé kompresní algoritmy.
Komprimované části začínají záhlavím identifikujícím kompresní algoritmus.
Komprimovaná pole záhlaví sekce
Velikost
|
název
|
Účel
|
ELF
32
|
ELF
64
|
čtyři
|
čtyři
|
ch_type
|
kompresní algoritmus.
název
|
Význam
|
Popis
|
ELFCOMPRESS_ZLIB
|
jeden
|
Data v sekci jsou komprimována pomocí algoritmu Zlib . Komprimovaná data následují bezprostředně za záhlavím a před koncem sekce.
|
ELFCOMPRESS_LOOS-ELFCOMPRESS_HIOS
|
1610612736 – 1879048191
|
Hodnoty závislé na operačním systému.
|
ELFCOMPRESS_LOPROC-ELFCOMPRESS_HIPROC
|
1879048192 – 2147483647
|
Hodnoty závislé na procesoru.
|
|
|
čtyři
|
ch_reserved
|
Rezervováno pro budoucí použití.
|
čtyři
|
osm
|
ch_size
|
Velikost dekomprimované sekce v bajtech.
|
čtyři
|
osm
|
ch_addralign
|
Požadované zarovnání pro dekomprimovanou sekci.
|
|
SHF_MASKOS
|
0x0ff00000
|
Všechny bity zahrnuté v tomto poli definují hodnoty závislé na operačním systému.
|
SHF_MASKPROC
|
0xf0000000
|
Všechny bity zahrnuté v tomto poli definují hodnoty specifické pro procesor.
|
|
čtyři
|
osm
|
sh_addr
|
Pokud má být sekce načtena do paměti při načítání souboru objektu, toto pole určuje adresu, ze které bude sekce načtena, jinak pole obsahuje 0.
|
čtyři
|
osm
|
sh_offset
|
Odsazení sekce od začátku souboru v bajtech. Části typu SHT_NOBITSnezabírají místo v souboru, pro ně toto pole obsahuje koncepční umístění v souboru.
|
čtyři
|
osm
|
sh_size
|
Velikost sekce v souboru. Může být nulový.
|
čtyři
|
sh_link
|
Index přidružené sekce. Toto pole může mít různé účely v závislosti na typu záhlaví.
Interpretace polí sh_linka sh_infov závislosti na hodnotě polesh_type
sh_type
|
sh_link
|
sh_info
|
SHT_DYNAMIC
|
Index záhlaví sekce tabulky řetězců, který používají prvky této sekce.
|
0
|
SHT_HASH
|
Index záhlaví sekce tabulky symbolů, do které tato hashovací tabulka patří.
|
0
|
SHT_REL,SHT_RELA
|
Index záhlaví sekce přidružené tabulky symbolů.
|
Index záhlaví sekce, na který se mají použít data o přemístění.
|
SHT_SYMTAB,SHT_DYNSYM
|
Index záhlaví sekce související tabulky řetězců.
|
O jeden více než index posledního lokálního symbolu ( STB_LOCAL) v tabulce symbolů.
|
SHT_GROUP
|
Index záhlaví sekce přidružené tabulky symbolů.
|
Index prvku v přidružené tabulce symbolů. Název zadaného prvku poskytuje podpis skupiny sekcí.
|
SHT_SYMTAB_SHNDX
|
Index záhlaví sekce přidružené sekce tabulky symbolů.
|
0
|
|
čtyři
|
sh_info
|
Další informace o sekci (možné hodnoty viz výše).
|
čtyři
|
osm
|
sh_addralign
|
Požadované zarovnání sekce.
|
čtyři
|
osm
|
sh_entsize
|
Velikost v bajtech každé položky (pokud sekce obsahuje pole položek s pevnou velikostí, jinak pole obsahuje 0).
|
Obsah sekcí a segmentů
Utility
Pro práci se soubory ELF existuje mnoho nástrojů , ty hlavní jsou obsaženy v softwarové sadě GNU Binutils :
- elfedit - Změna hlavičky souboru ELF, součást sady GNU Binutils.
- objdump - výstupní informace o objektových souborech (včetně ELF), součást sady GNU Binutils.
- readelf - Zobrazuje podrobné informace o objektovém souboru ve formátu ELF, který je součástí sady GNU Binutils.
- elfdump- zobrazit informace o souboru ELF, který je součástí sady GNU Binutils.
- elfutilsje alternativou pro GNU Binutils, oficiálně dostupný pouze pro GNU/Linux , ale existují porty na jiné operační systémy [4] .
- file- výstup malého množství informací o souborech ve formátech, které program zná (dostupné pro většinu operačních systémů podobných UNIXu ).
Viz také
Poznámky
- ↑ System V Application Binary Interface Archivováno 21. května 2015 ve Wayback Machine Edition 4.1 (1997-03-18 )
- ↑ Specifikace ELF Archivována 16. června 2012 na Wayback Machine
- ↑ Formát objektového souboru ELF-64 Archivováno 1. července 2015 na Wayback Machine
- ↑ FreshPorts -- devel/elfutils . www.freshports.org. Získáno 31. března 2018. Archivováno z originálu 16. února 2018. (neurčitý)
Odkazy