Man elf (5) formatul fișierelor executabile și legături (elf)

În fișierul antet Formatul ELF este definit pentru fișiere binare executabile. Aceste fișiere includ fișiere executabile obișnuite, fișiere obiect transferabile, fișiere de bază și obiecte obișnuite.







Fișierul executabil în format ELF constă în antetul ELF, tabelul anteturilor programului sau tabelul antetului secțiunii (sau ambele tabele). Antetul ELF este întotdeauna localizat la începutul fișierului. Locația tabelului de titlu al programului și tabela antetului secțiunii sunt specificate în antetul ELF. Cele două tabele descriu restul conținutului fișierului.

Acest fișier antet descrie anteturile de mai sus sub formă de structuri C și include, de asemenea, o descriere a structurilor partițiilor dinamice, partițiilor de mișcare și tabelelor de simboluri.

Pentru fiecare arhitectură N-bit, un tip adecvat (N = 32,64; ElfN poate fi Elf32 sau Elf64; uintN_t pot fi uint32_t sau uint64_t):

(Notă: * BSD utilizează o terminologie ușor diferită Deci, Elf64_Half --- de două ori Elf32_Half și Elf64Quarter --- uint16_t A nu se confunda, atunci aceste tipuri sunt înlocuite cu tipuri distincte ....)

Toate structurile de date ale acestui format de fișier respectă principiile de dimensiune "naturală" și principiile de aliniere ale clasei corespunzătoare. Dacă este necesar, structuri de date conțin materiale de umplutură menționate în mod explicit (padding) pentru a alinia al 4-lea octet la 4 obiect octet pentru a ajusta dimensiunea structurilor la un multiplu de 4 și t. D.

Antetul ELF este descris de tipul Elf32_Ehdr sau Elf64_Ehdr.

Tabelul antetului programului al unui fișier obiect executabil sau partajat este o serie de structuri, fiecare dintre acestea descriind un segment sau conține alte informații pe care sistemul trebuie să le pregătească pentru execuție. Segmentul de fișier obiect conține una sau mai multe secțiuni. Antetele programului sunt necesare doar pentru fișierele obiect executabile și partajate. Dimensiunea anteturilor programului este indicată în fișierul din antetul ELF în câmpurile e_phentsize și e_phnum. Antetul programului ELF este descris de tipul Elf32_Phdr sau Elf64_Phdr. în funcție de arhitectură:

Principala diferență dintre antetul programului pe 32 de biți și 64 de biți din structură este locația câmpului p_flags.

Din tabelul anteturilor de partiții, puteți găsi locația tuturor partițiilor din fișier. Este o serie de structuri Elf32_Shdr sau Elf64_Shdr. La începutul tabelului cu antetul secțiunii din fișier, este indicat câmpul e_shoff al antetului ELF (în octeți). E_shnum conține numărul de elemente din tabelul antetului secțiunii. E_shentsize conține dimensiunea fiecărui element în octeți.

Indicele elementului din tabelul cu antet de partiție indică acest tablou. Unele indexuri ale elementului din tabelul cu anteturi de partiții sunt rezervate: elementul de pornire și indicii din SHN_LORESERVE și SHN_HIRESERVE. Elementul de pornire este utilizat în extensiile ELF pentru e_phnum. e_shnum și e_strndx; în alte cazuri, fiecare câmp al elementului inițial este zero. Nu există secțiuni cu acești indici speciali în fișierul obiect:

Antetul secțiunii are următoarea structură:

Nu există o diferență semnificativă între anteturile de secțiuni pe 32 de biți și 64 de biți.

Programul și informațiile de control sunt cuprinse în diferite secțiuni:







Secțiunile cu tabele de rang conțin secvențe de caractere care se termină cu null, care de obicei sunt numite șiruri de caractere. Fișierul obiect utilizează aceste linii pentru numele caracterelor și secțiunilor. Se referă la un rând printr-un index din secțiunea tabelă a rândurilor. Primul octet cu un index null este specificat byte null ('\ 0'). În mod similar, pentru a se asigura că toate rândurile sunt nulă, ultimul octet al tabelului de rang conține, de asemenea, un octet nul.

Tabela de fișiere obiect conține informațiile necesare pentru a localiza și muta simbolurile și legăturile definite în program. Indicele tabelului simbolurilor indică un element din această matrice.

Versiunile pe 32 de biți și 64 de biți au aceleași câmpuri, doar ordinea lor este diferită.

st_name Acest câmp conține un index al elementului din tabelul șirului de caractere al fișierului obiect, care conține o reprezentare simbolică a numelor de simboluri. Dacă valoarea nu este zero, atunci acesta este indicele tabelului de rânduri, prin care se determină numele simbolului. În caz contrar, tabela de simboluri nu are nume. st_value Acest câmp conține valoarea caracterului corespunzător. st_size Multe dimensiuni sunt asociate cu mai multe caractere. Acest câmp este setat la zero dacă caracterul nu are o dimensiune sau dimensiunea acestuia este necunoscută. st_info Acest câmp specifică tipul de caractere și atributele de legare: STT_NOTYPE Tipul de caractere nu este definit. STT_OBJECT Simbolul corespunde obiectului de date. STT_FUNC Simbolul corespunde unei funcții sau alt cod executabil. STT_SECTION Simbolul corespunde secțiunii. Elementele tabelului de simboluri de acest tip există în primul rând pentru deplasare și de obicei au legături STB_LOCAL. STT_FILE În mod convențional, numele de simbol este atribuit în funcție de numele fișierului sursă pentru fișierul obiect corespunzător. Simbolul fișierului are legături STB_LOCAL. indexul său din secțiunea SHN_ABS. și este precedat de un alt caracter STB_LOCAL, dacă este cazul. STT_LOPROC Toate valorile, începând cu acest lucru și mai mult, prin STT_HIPROC inclusiv, sunt rezervate pentru semantica orientată pe procesoare. STT_HIPROC Toate valorile, începând cu această și mai puțin, cu STT_LOPROC inclusiv, sunt rezervate pentru semantica orientată pe procesor. STB_LOCAL Caracterele locale nu sunt vizibile în afara fișierului obiect care conține definițiile acestora. Simbolurile locale cu aceleași nume pot exista în mai multe fișiere fără a se interfera între ele. STB_GLOBAL Caracterele globale sunt vizibile în toate fișierele obiect după fuziune. Definiția unui simbol global într-un singur fișier va rezolva o referință nedefinită într-un alt fișier pentru același simbol. STB_WEAK Simbolurile slabe sunt similare simbolurilor globale, însă definițiile lor au o prioritate mai mică. STB_LOPROC Toate valorile, începând cu acest și altele, inclusiv cu STB_HIPROC, sunt rezervate pentru semantica orientată pe procesoare. STB_HIPROC Toate valorile de la acest lucru și mai puțin de STB_LOPROC inclusiv, sunt rezervate pentru semantica orientate spre procesor. Macrocomenzi pentru ambalarea și despachetarea legarea și tipul câmpurile: ELF32_ST_BIND (info) sau ELF64_ST_BIND (info) este recuperat din valorile de legare st_info. ELF32_ST_TYPE (info) sau ELF64_ST_TYPE (info)
extrageți tipul din st_info. ELF32_ST_INFO (legați, tastați) sau ELF64_ST_INFO (legați, tastați)
converti legarea și tipul la st_info. st_other Acest câmp determină vizibilitatea caracterului. STV_DEFAULT Reguli standard de vizibilitate a caracterelor. STV_INTERNAL O clasă ascunsă care depinde de procesor. STV_HIDDEN Simbolul nu este disponibil în alte module. STV_PROTECTED Neîncărcabilă, neimportată.

Aceste macrocomenzi servesc la regăsirea tipului de vizibilitate:

ELF32_ST_VISIBILITY (alte) sau ELF64_ST_VISIBILITY (altele)

st_shndx Fiecare element al tabelului de simboluri este "definit" cu privire la o anumită secțiune. Acest câmp conține indexul corespunzător al tabelului cu antetul secțiunii.

Mutarea este procesul de conectare a legăturilor simbolice cu definițiile simbolice. Fișierele mobile trebuie să conțină informații care să descrie modul de modificare a conținutului partițiilor, pentru a permite ca fișierele obiect executabile și dinamice să conțină informațiile corecte pentru imaginea de proces a programului. Pentru aceasta, există deplasări.

Structuri mobile care nu au nevoie de un aditiv:

Structuri mobile care au nevoie de un aditiv:

Secțiunea .dynamic conține mai multe structuri, care conțin informații despre aspectul dinamic. Câmpul d_tag ​​controlează interpretarea d_un.

ELF a apărut pentru prima dată în Sistemul V. Formatul ELF este un standard aprobat.

Extensii pentru e_phnum. e_shnum și e_strndx a extensiilor corespunzătoare Linux. Ele sunt de asemenea suportate în Sun, BSD și AMD64; pentru mai multe informații, consultați "Vedeți de asemenea".







Trimiteți-le prietenilor: