Format executabil și conectabil
Versiunea actuală a paginii nu a fost încă examinată de colaboratori experimentați și poate diferi semnificativ de
versiunea revizuită pe 7 iunie 2021; verificările necesită
6 modificări .
ELF ( Engleză Executable and Linkable Format - format de fișier executabil și conectabil) este un format de fișier binar utilizat în multe sisteme de operare moderne asemănătoare UNIX , cum ar fi FreeBSD , Linux , Solaris etc.
Istorie
Standardul de format ELF a fost inițial dezvoltat și publicat de ca parte a interfeței aplicației binare UNIX System V [1] . Apoi a fost selectat de comitetul și dezvoltat ca format portabil pentru diferite sisteme de operare care rulează pe arhitectura hardware Intel x86 pe 32 de biți . [2] ELF a câștigat rapid popularitate și, după ce HP a extins formatul și a publicat standardul ELF-64, sa răspândit pe platformele pe 64 de biți. [3]
Tipuri
Standardul de format ELF distinge mai multe tipuri de fișiere:
- Fișier relocabil - stochează instrucțiuni și date care pot fi legate la alte fișiere obiect . Rezultatul unei astfel de legături poate fi un fișier obiect partajat sau un fișier executabil. Acest tip include fișiere obiect ale bibliotecilor statice.
- Fișier obiect partajat - conține, de asemenea, instrucțiuni și date și poate fi asociat cu alte fișiere relocabile și fișiere obiect partajate, în urma cărora va fi creat un nou fișier obiect, sau când programul este lansat pentru execuție, sistemul de operare se poate asocia dinamic acesta cu fișierul executabil al programului, ca rezultat, care va crea o imagine executabilă a programului. În acest din urmă caz, vorbim de biblioteci partajate.
- Fișier executabil - conține o descriere completă care permite sistemului să creeze o imagine a procesului . Inclusiv: instrucțiuni, date, descrierea fișierelor obiect partajate necesare și informațiile simbolice și de depanare necesare.
Format
Fiecare fișier ELF este format din următoarele părți:
Antetul fișierului
Antetul fișierului (ELF Header) are o locație fixă la începutul fișierului și conține o descriere generală a structurii fișierului și a principalelor caracteristici ale acestuia, cum ar fi: tipul, versiunea formatului, arhitectura procesorului , adresa punctului de intrare virtual , dimensiunile și offseturile. a altor părți ale dosarului. Antetul are 52 de octeți pentru fișierele pe 32 de biți sau 64 pentru fișierele pe 64 de biți . Această diferență se datorează faptului că antetul fișierului conține trei câmpuri cu dimensiunea pointerului, care este de 4 și 8 octeți pentru procesoarele pe 32 de biți și, respectiv, pe 64 de biți. Aceste câmpuri sunt e_entry, e_phoffși e_shoff.
Câmpurile antet fișierului ELF
Marimea
|
Nume |
Scop
|
ELF
32
|
ELF
64
|
16
|
e_ident[16] |
Caracteristicile generale ale dosarului.
Octeți de matricee_ident
Index
|
Nume
|
Scop
|
0 - 3
|
EI_MAG0-EI_MAG3
|
Semnătură fișier: 0x7f 0x45 0x4c 0x46.
|
patru
|
EI_CLASS
|
Clasa fișier obiect.
Nume
|
Sens
|
Descriere
|
ELFCLASSNONE
|
0
|
Clasa incorecta
|
ELFCLASS32
|
unu
|
fișier obiect pe 32 de biți
|
ELFCLASS64
|
2
|
fișier obiect pe 64 de biți
|
|
5
|
EI_DATA
|
Metoda de codificare a datelor dependentă de procesor.
|
6
|
EI_VERSION
|
Versiunea ELF a antetului. În prezent, valoarea acestui octet ar trebui să fie EV_CURRENT.
|
7
|
EI_OSABI
|
Sistemul de operare sau extensiile specifice ABI utilizate în fișier. Unele câmpuri din alte structuri de fișiere ELF au steaguri și câmpuri a căror semnificație depinde de sistemul de operare sau de ABI; interpretarea acestor câmpuri este determinată de valoarea octetului dat. Dacă fișierul obiect nu folosește extensii, se recomandă ca acest octet să fie setat la 0. Dacă valoarea pentru acest octet este în intervalul de la 64până la 255, atunci interpretarea sa depinde de valoarea câmpului antet ELF e_machine. În acest interval, fiecare arhitectură își poate defini propriul set de valori.
Nume
|
Sens
|
Descriere
|
ELFOSABI_NONE
|
0
|
UNIX System V ABI
|
ELFOSABI_HPUX
|
unu
|
HP-UX
|
ELFOSABI_NETBSD
|
2
|
NetBSD
|
ELFOSABI_GNU
|
3
|
Fișierul folosește extensii GNU ELF ( GNU/Linux )
|
ELFOSABI_SOLARIS
|
6
|
Solaris
|
ELFOSABI_AIX
|
7
|
AIX
|
ELFOSABI_IRIX
|
opt
|
IRIX
|
ELFOSABI_FREEBSD
|
9
|
FreeBSD
|
ELFOSABI_TRU64
|
zece
|
Tru64 UNIX
|
ELFOSABI_MODESTO
|
unsprezece
|
Modesto
|
ELFOSABI_OPENBSD
|
12
|
OpenBSD
|
ELFOSABI_OPENVMS
|
13
|
openvms
|
ELFOSABI_NSK
|
paisprezece
|
Kernel
non-stop |
ELFOSABI_AROS
|
cincisprezece
|
Amiga Research OS
|
ELFOSABI_FENIXOS
|
16
|
fenixOS
|
ELFOSABI_CLOUDABI
|
17
|
CloudABI
|
ELFOSABI_OPENVOS
|
optsprezece
|
OpenVOS
|
|
64 - 255
|
Valori dependente de procesor
|
|
opt
|
EI_ABIVERSION
|
Versiunea ABI.
|
9
|
EI_PAD
|
T. n. padding bytes (umplutură). Elemente de matrice rezervate pentru utilizare ulterioară e_ident. Instalat de obicei în 0. Cititorii de fișiere obiect ar trebui să le ignore.
|
zece
|
EI_PAD + 1
|
unsprezece
|
EI_PAD + 2
|
12
|
EI_PAD + 3
|
13
|
EI_PAD + 4
|
paisprezece
|
EI_PAD + 5
|
cincisprezece
|
EI_PAD + 6
|
|
2
|
e_type |
Tip fișier.
Nume
|
Sens
|
Descriere
|
ET_NONE
|
0
|
Incert
|
ET_REL
|
unu
|
Fișier în curs de mutare
|
ET_EXEC
|
2
|
Executabil
|
ET_DYN
|
3
|
Fișier obiect partajat
|
ET_CORE
|
patru
|
fișier de bază
|
ET_LOOS-ET_HIOS
|
65024 - 65279
|
Valori dependente de sistemul de operare
|
ET_LOPROC-ET_HIPROC
|
65280 - 65535
|
Valori dependente de procesor
|
|
2
|
e_machine |
Arhitectura platformei hardware pentru care a fost creat fișierul:
Nume
|
Sens
|
Descriere
|
EM_NONE
|
0x0
|
Nedefinit
|
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 |
Rezervat pentru utilizare ulterioară
|
EM_PARISC
|
0x0F |
Hewlett-Packard PA-RISC
|
|
0x10 |
Rezervat pentru utilizare ulterioară
|
EM_960
|
0x13 |
Intel 80960
|
EM_PPC
|
0x14
|
PowerPC
|
EM_PPC64
|
0x15
|
PowerPC (64 de biți)
|
EM_S390
|
0x16 |
S390 , inclusiv S390x
|
EM_SPU
|
0x17 |
IBM SPU/SPC
|
|
0x18 - 0x23 |
Rezervat pentru utilizare ulterioară
|
EM_V800
|
0x24 |
NEC V800
|
EM_FR20
|
0x25 |
Fujitsu FR20
|
EM_RH32
|
0x26 |
TRW RH-32
|
EM_MCOREșiEM_RCE
|
0x27 |
Motorola RCE
|
EM_ARM
|
0x28 |
ARM (până la ARMv7/Aarch32)
|
EM_OLD_ALPHA
|
0x29 |
Alfa digitală
|
EM_SH
|
0x2A |
superh
|
EM_SPARCV9
|
0x2B |
SPARC versiunea 9
|
EM_TRICORE
|
0x2C |
Procesor încorporat Siemens TriCore
|
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 Multimedia Accelerator
|
EM_PCP
|
0x37 |
Siemens PCP
|
EM_NCPU
|
0x38 |
Procesor RISC nCPU încorporat Sony
|
EM_NDR1
|
0x39 |
Microprocesor 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. Familia de procesoare încorporate TinyJ
|
EM_X86_64
|
0x3E
|
AMD x86-64
|
EM_MCST_ELBRUS
|
0xAF
|
Elbrus (arhitectura procesorului)
|
EM_TI_C6000
|
0x8C |
Familia TMS320C6000
|
EM_AARCH64
|
0xB7 |
ARM pe 64 de biți (ARMv8/Aarch64)
|
EM_RISCV
|
0xF3 |
RISC-V
|
EM_BPF
|
0xF7 |
Filtrul de pachete Berkeley
|
EM_65816
|
0x101
|
WDC 65C816
|
|
patru
|
e_version |
Formatează numărul versiunii. Momentan, o singură valoare este considerată corectă.
Nume
|
Sens
|
Descriere
|
EV_NONE
|
0
|
Valoare incorectă
|
EV_CURRENT
|
unu
|
Versiune curentă
|
|
patru
|
opt
|
e_entry |
Adresa virtuală a punctului de intrare către care sistemul trece controlul când începe procesul. Dacă fișierul nu are un punct de intrare, acest câmp conține 0.
|
patru
|
opt
|
e_phoff |
Offset al tabelului antet programului de la începutul fișierului, în octeți. Dacă fișierul nu are un tabel de antet de program, acest câmp conține 0.
|
patru
|
opt
|
e_shoff |
Tabelul antetului secțiunii decalat de la începutul fișierului, în octeți. Dacă fișierul nu are un tabel de antet de secțiune, acest câmp conține 0.
|
patru
|
e_flags |
Steaguri specifice procesorului asociate cu fișierul . Dacă acestea sunt absente, acest câmp conține 0.
|
2
|
e_ehsize |
Dimensiunea antetului fișierului în octeți ( 52pentru fișiere pe 32 de biți și 6464 de biți).
|
2
|
e_phentsize |
Dimensiunea unui antet de program. Toate anteturile programelor au aceeași dimensiune ( 32pentru fișierele pe 32 de biți și 56pentru cele pe 64 de biți).
|
2
|
e_phnum |
Numărul de antete de program. Dacă fișierul nu are un tabel de antet de program, acest câmp conține 0.
|
2
|
e_shentsize |
Dimensiunea unui antet de secțiune. Toate anteturile de secțiune au aceeași dimensiune ( 40pentru fișierele pe 32 de biți și 64pentru cele pe 64 de biți).
|
2
|
e_shnum |
Numărul de anteturi de secțiune. Dacă fișierul nu are un tabel de antet de secțiune, acest câmp conține 0.
|
2
|
e_shstrndx |
Indexul unei intrări din tabelul antet de secțiune care descrie tabelul de nume de secțiuni (de obicei, acest tabel se numește .shstrtab și reprezintă o secțiune separată). Dacă fișierul nu conține un tabel cu nume de secțiune, acest câmp conține 0.
|
Tabel antet program
Tabelul antet programului conține anteturi, fiecare dintre acestea descriind un segment de program separat și atributele acestuia, sau alte informații necesare sistemului de operare pentru a pregăti programul pentru execuție. Acest tabel poate fi localizat oriunde în fișier, locația sa (offset față de începutul fișierului) este descrisă în e_phoffcâmpul antet ELF.
Când analizați structura antetului programului, puteți găsi diferite locații de câmp p_flagspentru fișierele ELF pe 32 și 64 de biți. Această diferență se datorează alinierii structurii pentru a crește eficiența procesării.
Câmpurile antet programului
Marimea
|
Nume
|
Scop
|
ELF
32
|
ELF
64
|
patru
|
p_type
|
Tipul de segment pe care îl descrie acest antet sau cum se interpretează valorile câmpului acestui antet.
Nume
|
Sens
|
Descriere
|
PT_NULL
|
0
|
Titlul nu este folosit, restul câmpurilor nu sunt definite. Acest tip vă permite să includeți elemente ignorate în tabelul antet al programului fișierului.
|
PT_LOAD
|
unu
|
Segmentul de încărcat, descris de câmpurile p_fileszși p_memsz. Octeții din fișier sunt mapați la un segment din memorie. Dacă dimensiunea segmentului de memorie ( p_memsz) este mai mare decât dimensiunea segmentului de fișier ( p_filesz), octeții suplimentari sunt completați cu zerouri (ei urmează imediat octeții definiți în segment). Dimensiunea unui segment dintr-un fișier ( p_filesz) nu poate fi mai mare decât dimensiunea unui segment din memorie ( p_memsz). Titlurile programelor ale segmentelor descărcabile sunt aranjate în tabelul titlurilor programelor în ordinea crescătoare a valorii câmpului p_vaddr.
|
PT_DYNAMIC
|
2
|
Antetul programului oferă informații despre legarea dinamică.
|
PT_INTERP
|
3
|
Antetul programului oferă dimensiunea și locația căii ( șiruri de caractere în stil C terminate cu nul) pentru a rula ca interpret. Acest tip de segment are sens doar pentru fișierele executabile (deși poate fi și într-un fișier obiect partajat); nu poate apărea de mai multe ori într-un fișier. Dacă este prezent un antet de acest tip, acesta trebuie să precedă orice antet de program al segmentului care este încărcat.
|
PT_NOTE
|
patru
|
Antetul programului definește locația și dimensiunea informațiilor auxiliare.
|
PT_SHLIB
|
5
|
Acest tip de segment este rezervat, dar sensul său este nedefinit. Programele care conțin un antet de program de acest tip nu respectă ABI.
|
PT_PHDR
|
6
|
Antetul programului, dacă este prezent, specifică locația și dimensiunea tabelului antet programului în sine, atât în fișier, cât și în imaginea de memorie a programului. Acest tip de segment nu poate apărea de mai multe ori într-un fișier. Mai mult, poate apărea numai dacă în fișier există un tabel de antet de program. Dacă este prezent un antet de acest tip, acesta trebuie să precedă orice antet de program al segmentului care este încărcat.
|
PT_TLS
|
7
|
Antetul programului definește modelul Thread-Local Storage. Încărcătoarele ELF nu trebuie să mențină această intrare în tabelul antet programului.
|
PT_LOOS-PT_HIOS
|
1610612736 - 1879048191
|
Valori dependente de sistemul de operare.
|
PT_LOPROC-PT_HIPROC
|
1879048192 - 2147483647
|
Valori dependente de procesor.
|
|
|
patru
|
p_flags
|
Segmentele legate de steaguri (pentru ELF64).
Nume
|
Sens
|
Descriere
|
PF_X
|
0x1
|
Permisiune de executare
|
PF_W
|
0x2
|
Permisiune de scriere
|
PF_R
|
0x4
|
Permisiune de citire
|
PF_MASKOS
|
0x0ff00000
|
Toți biții incluși în acest câmp definesc valori dependente de sistemul de operare.
|
PF_MASKPROC
|
0xf0000000
|
Toți biții incluși în acest câmp definesc valori specifice procesorului.
|
|
patru
|
opt
|
p_offset
|
Segment offset de la începutul fișierului.
|
patru
|
opt
|
p_vaddr
|
Adresa virtuală a segmentului din memorie unde segmentul ar trebui să fie încărcat atunci când este mapat în memorie.
|
patru
|
opt
|
p_paddr
|
Adresa fizică a segmentului (pentru sistemele în care este importantă).
|
patru
|
opt
|
p_filesz
|
Dimensiunea segmentului din fișier. Poate fi nulă.
|
patru
|
opt
|
p_memsz
|
Dimensiunea segmentului din memorie. Poate fi nulă.
|
patru
|
|
p_flags
|
Segmentează steaguri (pentru ELF32) (vezi mai sus pentru valori posibile).
|
patru
|
opt
|
p_align
|
Alinierea segmentelor. 0și 1determina lipsa de aliniere. În caz contrar, trebuie să fie un 2 pozitiv într-o anumită măsură.
|
Tabel antet secțiuni
Tabelul antet secțiunii conține atributele secțiunii fișierului. Acest tabel este necesar doar de linker, fișierele executabile nu au nevoie de acest tabel (încărcătorul ELF îl ignoră). Informațiile furnizate în tabelul antet secțiunii sunt folosite de linker pentru a aranja optim aceste secțiuni în segmente la compilarea fișierului, ținând cont de atributele acestora.
Câmpurile antetului secțiunii
Marimea
|
Nume
|
Scop
|
ELF
32
|
ELF
64
|
patru
|
sh_name
|
Decalaj al liniei care conține numele acestei secțiuni, relativ la începutul tabelului de nume de secțiuni.
|
patru
|
sh_type
|
Tip antet.
Nume
|
Sens
|
Descriere
|
SHT_NULL
|
0
|
Titlul nu este folosit, restul câmpurilor nu sunt definite.
|
SHT_PROGBITS
|
unu
|
Secțiunea conține informații definite de program, formatul și semnificația acestuia sunt determinate numai de program.
|
SHT_SYMTAB
|
2
|
Secțiunea conține tabelul cu simboluri. Nu poate exista decât o astfel de secțiune într-un fișier momentan.
|
SHT_STRTAB
|
3
|
Secțiunea conține un tabel de șiruri. Un fișier poate avea multe secțiuni de acest tip.
|
SHT_RELA
|
patru
|
Secțiunea conține informații extinse despre mișcări. Un fișier poate avea multe secțiuni de acest tip.
|
SHT_HASH
|
5
|
Secțiunea conține un tabel hash cu simboluri. Nu poate exista decât o astfel de secțiune într-un fișier momentan.
|
SHT_DYNAMIC
|
6
|
Secțiunea conține informații despre conectarea dinamică. Nu poate exista decât o astfel de secțiune într-un fișier momentan.
|
SHT_NOTE
|
7
|
Secțiunea conține informații care marchează fișierul într-un fel.
|
SHT_NOBITS
|
opt
|
Secțiunea nu ocupă spațiu în fișier, altfel este similară cu SHT_PROGBITS.
|
SHT_REL
|
9
|
Secțiunea conține informații despre mișcări. Un fișier poate avea multe secțiuni de acest tip.
|
SHT_SHLIB
|
zece
|
Acest tip de secțiune este definit, dar nu are o semnificație specifică.
|
SHT_DYNSYM
|
unsprezece
|
Secțiunea conține tabelul cu simboluri. Nu poate exista decât o astfel de secțiune într-un fișier momentan.
|
SHT_INIT_ARRAY
|
paisprezece
|
Secțiunea conține o serie de pointeri către funcțiile de inițializare a programului. Funcțiile nu trebuie să accepte argumente și să nu returneze nimic.
|
SHT_FINI_ARRAY
|
cincisprezece
|
Secțiunea conține o serie de pointeri către funcțiile de finalizare a programului. Funcțiile nu trebuie să accepte argumente și să nu returneze nimic.
|
SHT_PREINIT_ARRAY
|
16
|
Secțiunea conține o serie de pointeri către funcții care sunt apelate înainte ca funcțiile de inițializare a programului să fie apelate. Funcțiile nu trebuie să accepte argumente și să nu returneze nimic.
|
SHT_GROUP
|
17
|
Această secțiune definește un grup de secțiuni. Un grup de secțiuni este o colecție de secțiuni înrudite care trebuie tratate într-un mod special de către linker. Astfel de secțiuni pot fi doar în fișiere obiect relocabile (al căror câmp e_typeare valoarea ET_REL). Titlul care definește un grup de secțiuni trebuie să fie în tabelul de secțiuni înainte de titlurile tuturor secțiunilor incluse în grupul care este definit.
|
SHT_SYMTAB_SHNDX
|
optsprezece
|
O secțiune este asociată cu un tabel de simboluri și este necesară dacă orice element al acestui tabel se referă la un antet de secțiune care are un index SHN_XINDEX(acest lucru se întâmplă dacă indexul secțiunii este atât de mare încât nu se încadrează în câmpul st_shndx). Secțiunea conține o serie de numere de tip Elf32_Wordpentru ELF32 și Elf64_Wordpentru ELF64. Fiecare element al acestui tablou corespunde unei intrări în tabelul de simboluri și este plasat în ordinea corespunzătoare. Aceste elemente sunt indici ai titlurilor de secțiuni cărora le sunt asociate simbolurile corespunzătoare. Dacă valoarea câmpului st_shndxelementului corespunzător din tabelul de simboluri este SHN_XINDEX, elementul conține indexul antetului de secțiune real, în caz contrar, elementul conține 0.
|
SHT_LOOS-SHT_HIOS
|
1610612736 - 1879048191
|
Valori dependente de sistemul de operare.
|
SHT_LOPROC-SHT_HIPROC
|
1879048192 - 2147483647
|
Valori dependente de procesor.
|
SHT_LOUSER-SHT_HIUSER
|
2147483648 - 4294967295
|
Valori dependente de program. Aceste valori pot fi utilizate de manipulatorii de fișiere în format ELF fără a intra în conflict cu valorile definite în prezent.
|
|
patru
|
opt
|
sh_flags
|
atributele secțiunii.
Nume
|
Sens
|
Descriere
|
SHF_WRITE
|
0x1
|
Permisiune de scriere.
|
SHF_ALLOC
|
0x2
|
Secțiunea ocupă memorie în timp ce procesul rulează. Unele secțiuni de serviciu nu sunt încărcate în memorie la încărcarea unui fișier obiect; pentru astfel de secțiuni, acest indicator este dezactivat.
|
SHF_EXECINSTR
|
0x4
|
Secțiunea conține instrucțiuni de mașină executabile.
|
SHF_MERGE
|
0x10
|
Datele dintr-o partiție pot fi combinate pentru a elimina dublarea. Dacă steagul SHF_STRINGSnu este setat, elementele de date din secțiune au aceeași dimensiune. Mărimea unui element este indicată în câmpul sh_entsize. Dacă indicatorul SHF_STRINGSeste setat, secțiunea constă din matrice de caractere terminate cu nul, iar dimensiunea unui caracter este specificată în câmpul sh_entsize.
Fiecare element dintr-o secțiune este comparat cu alte elemente din secțiuni cu același nume, tip și steaguri. Elementele care vor avea aceeași valoare în timpul execuției programului pot fi combinate. Mișcările care se referă la membrii unor astfel de secțiuni trebuie rezolvate în consecință. Înainte de îmbinare, toate elementele unei secțiuni trebuie analizate pentru a determina dacă valorile vor fi efectiv identice în timpul execuției.
Această asociere nu este o cerință pentru conformitatea ABI.
|
SHF_STRINGS
|
0x20
|
O secțiune constă din matrice de caractere terminate cu nul. Mărimea unui caracter este indicată în câmp sh_entsize.
|
SHF_INFO_LINK
|
0x40
|
Câmpul antet secțiunii sh_infoconține indexul intrării din tabelul antetului secțiunii.
|
SHF_LINK_ORDER
|
0x80
|
Cerințe speciale de locație. Cerințele se aplică dacă sh_linkcâmpul antet al secțiunii se referă la o altă secțiune (secțiune aferentă). Dacă sh_linkcâmpul secțiune legată nu conține 0, secțiunea curentă trebuie să fie în fișierul de ieșire în aceeași ordine în raport cu secțiunea legată, așa cum secțiunea legată este în raport cu secțiunea la care este legată.
|
SHF_OS_NONCONFORMING
|
0x100
|
Secțiunea necesită o gestionare specială, specifică sistemului de operare, pentru a preveni comportamentul incorect.
|
SHF_GROUP
|
0x200
|
Secțiune - un element (posibil singurul) al unui grup de secțiuni
|
SHF_TLS
|
0x400
|
Secțiunea conține Thread-Local Storage, fiecare thread va avea propria sa copie a acestei secțiuni.
|
SHF_COMPRESSED
|
0x800
|
Secțiunea conține date comprimate. Acest flag se aplică numai secțiunilor pentru care memoria nu este alocată la încărcarea unui fișier obiect în memorie. Steagul nu este folosit în combinație cu SHF_ALLOC. Acest steag nu se aplică nici secțiunilor de tip SHT_NOBITS.
Toate mișcările legate de o secțiune comprimată se referă la datele acesteia în starea necomprimată. Prin urmare, decompresia secțiunii este necesară pentru a permite mișcarea. Fiecare secțiune comprimată își definește propriul algoritm de compresie. Este acceptabil ca diferite secțiuni dintr-un fișier obiect ELF să utilizeze diferiți algoritmi de compresie.
Secțiunile comprimate încep cu un antet care identifică algoritmul de compresie.
Câmpuri de antet de secțiune comprimate
Marimea
|
Nume
|
Scop
|
ELF
32
|
ELF
64
|
patru
|
patru
|
ch_type
|
algoritm de compresie.
Nume
|
Sens
|
Descriere
|
ELFCOMPRESS_ZLIB
|
unu
|
Datele din secțiune sunt comprimate folosind algoritmul Zlib . Datele comprimate urmează imediat după antet și înainte de sfârșitul secțiunii.
|
ELFCOMPRESS_LOOS-ELFCOMPRESS_HIOS
|
1610612736 - 1879048191
|
Valori dependente de sistemul de operare.
|
ELFCOMPRESS_LOPROC-ELFCOMPRESS_HIPROC
|
1879048192 - 2147483647
|
Valori dependente de procesor.
|
|
|
patru
|
ch_reserved
|
Rezervat pentru utilizare ulterioară.
|
patru
|
opt
|
ch_size
|
Dimensiunea în octeți a secțiunii decomprimate.
|
patru
|
opt
|
ch_addralign
|
Alinierea necesară pentru secțiunea decomprimată.
|
|
SHF_MASKOS
|
0x0ff00000
|
Toți biții incluși în acest câmp definesc valori dependente de sistemul de operare.
|
SHF_MASKPROC
|
0xf0000000
|
Toți biții incluși în acest câmp definesc valori specifice procesorului.
|
|
patru
|
opt
|
sh_addr
|
Dacă secțiunea urmează să fie încărcată în memorie atunci când fișierul obiect este încărcat, acest câmp specifică adresa de la care se va încărca secțiunea, în caz contrar câmpul conține 0.
|
patru
|
opt
|
sh_offset
|
Secțiunea decalată de la începutul fișierului în octeți. Secțiunile de tip SHT_NOBITSnu ocupă spațiu în fișier; pentru ele, acest câmp conține locația conceptuală din fișier.
|
patru
|
opt
|
sh_size
|
Dimensiunea secțiunii în fișier. Poate fi nulă.
|
patru
|
sh_link
|
Indexul secțiunii asociate. Acest câmp poate avea scopuri diferite în funcție de tipul antetului.
Interpretarea câmpurilor sh_linkși sh_infoîn funcție de valoarea câmpuluish_type
sh_type
|
sh_link
|
sh_info
|
SHT_DYNAMIC
|
Indexul antetului secțiunii tabelului de șiruri care este utilizat de elementele acestei secțiuni.
|
0
|
SHT_HASH
|
Indexul antetului secțiunii tabelului de simboluri căreia îi aparține acest tabel hash.
|
0
|
SHT_REL,SHT_RELA
|
Indexul antetului de secțiune al tabelului de simboluri asociat.
|
Indexul antetului secțiunii la care urmează să fie aplicate datele de relocare.
|
SHT_SYMTAB,SHT_DYNSYM
|
Indexul antetului de secțiune al tabelului de șiruri asociat.
|
Unul mai mult decât indexul ultimului simbol local ( STB_LOCAL) din tabelul de simboluri.
|
SHT_GROUP
|
Indexul antetului de secțiune al tabelului de simboluri asociat.
|
Indicele elementului din tabelul de simboluri asociat. Numele elementului specificat furnizează semnătura grupului de secțiuni.
|
SHT_SYMTAB_SHNDX
|
Indexul antetului de secțiune al secțiunii asociate tabelului de simboluri.
|
0
|
|
patru
|
sh_info
|
Informații suplimentare despre secțiune (vezi mai sus pentru valorile posibile).
|
patru
|
opt
|
sh_addralign
|
Alinierea secțiunii necesară.
|
patru
|
opt
|
sh_entsize
|
Dimensiunea în octeți a fiecărei intrări (dacă secțiunea conține o matrice de intrări de dimensiune fixă, în caz contrar câmpul conține 0).
|
Conținutul secțiunilor și segmentelor
Utilități
Există multe utilitare pentru lucrul cu fișierele ELF, cele principale sunt conținute în setul de instrumente software GNU Binutils :
- elfedit - Modificarea antetului fișierului ELF, parte a suitei GNU Binutils.
- objdump - informații de ieșire despre fișierele obiect (inclusiv ELF), parte a setului GNU Binutils.
- readelf - Afișează informații detaliate despre un fișier obiect în format ELF, parte din suita GNU Binutils.
- elfdump- afișați informații despre fișierul ELF, parte din suita GNU Binutils.
- elfutilseste o alternativă pentru GNU Binutils, disponibilă oficial doar pentru GNU/Linux , dar există porturi pentru alte sisteme de operare [4] .
- file- scoateți o cantitate mică de informații despre fișierele de formate cunoscute de program (disponibilă pentru majoritatea sistemelor de operare asemănătoare UNIX ).
Vezi și
Note
- ↑ System V Application Binary Interface Arhivat 21 mai 2015 la Wayback Machine Edition 4.1 (1997-03-18 )
- ↑ Specificația ELF Arhivată pe 16 iunie 2012 la Wayback Machine
- ↑ ELF-64 Object File Format Arhivat la 1 iulie 2015 la Wayback Machine
- ↑ FreshPorts -- devel/elfutils . www.freshports.org. Preluat la 31 martie 2018. Arhivat din original la 16 februarie 2018. (nedefinit)
Link -uri