ELF

Izpratne par ELF faila formātu

Izpratne par ELF faila formātu

No pirmkoda līdz bināram kodam

Programmēšana sākas ar gudru ideju un avota koda ierakstīšanu izvēlētajā programmēšanas valodā, piemēram, C, un avota koda saglabāšanu failā. Ar atbilstoša kompilatora, piemēram, GCC palīdzību vispirms avota kods tiek pārveidots objekta kodā. Galu galā saite objekta kodu pārveido binārā failā, kas saista objekta kodu ar atsauces bibliotēkām. Šis fails satur atsevišķas instrukcijas kā mašīnkodu, ko saprot CPU un izpilda, tiklīdz tiek palaista kompilētā programma.

Iepriekš minētais binārais fails seko noteiktai struktūrai, un viens no visbiežāk sastopamajiem failiem tiek nosaukts ELF, kas saīsina izpildāmo un sasaistāmo formātu. To plaši izmanto izpildāmiem failiem, pārvietojamiem objektu failiem, koplietojamām bibliotēkām un galveno izgāztuvēm.

Pirms divdesmit gadiem - 1999. gadā - projekts 86open ir izvēlējies ELF kā standarta binārā faila formātu Unix un Unix līdzīgām sistēmām x86 procesoros. Par laimi, ELF formāts iepriekš bija dokumentēts gan sistēmas V lietojumprogrammas binārā saskarnē, gan rīku saskarnes standartā [4]. Šis fakts ārkārtīgi vienkāršoja vienošanos par standartizāciju starp dažādiem Unix operētājsistēmu piegādātājiem un izstrādātājiem.

Šā lēmuma iemesls bija ELF dizains - elastība, paplašināmība un dažādu platformu atbalsts dažādiem gala formātiem un adrešu lielumiem. ELF dizains neaprobežojas tikai ar noteiktu procesoru, instrukciju kopu vai aparatūras arhitektūru. Detalizētu izpildāmo failu formātu salīdzinājumu skatiet šeit [3].

Kopš tā laika ELF formātu izmanto vairākas dažādas operētājsistēmas. Cita starpā tas ietver Linux, Solaris / Illumos, Free-, Net- un OpenBSD, QNX, BeOS / Haiku un Fuchsia OS [2]. Turklāt to atradīsit mobilajās ierīcēs, kurās darbojas operētājsistēma Android, Maemo vai Meego OS / Sailfish OS, kā arī spēļu konsolēs, piemēram, PlayStation Portable, Dreamcast un Wii.

Specifikācija neskaidro ELF failu faila nosaukuma paplašinājumu. Lietošanā ir dažādas burtu kombinācijas, piemēram, .axf, .atkritumu tvertne, .elfs, .o, .prx, .dvesma, .ko, .tā, un .mod vai neviens.

ELF faila struktūra

Linux terminālā komanda man elf sniedz jums ērtu kopsavilkumu par ELF faila struktūru:

1. saraksts: ELF struktūras lapa

$ man elf
ELF (5) Linux programmētāja rokasgrāmata ELF (5)
NAME
elf - izpildāmā un saistošā formāta (ELF) failu formāts
SINOPSE
# iekļaut
APRAKSTS
Galvenes fails nosaka ELF izpildāmā binārā formātu
failus. Starp šiem failiem ir parastie izpildāmie faili, kurus var pārvietot citur
objektu faili, galvenie faili un koplietojamās bibliotēkas.
Izpildāms fails, kurā tiek izmantots ELF faila formāts, sastāv no ELF galvenes,
kam seko programmas galvenes tabula vai sadaļu galvenes tabula, vai abi.
ELF galvene vienmēr atrodas faila nulles nobīdē. Programma
galvenes tabula un sadaļas galvenes tabulas nobīde failā ir
definēts ELF galvenē. Abas tabulas apraksta pārējo
lietas īpatnības.

Kā redzams no iepriekš aprakstītā, ELF fails sastāv no divām sadaļām - ELF galvenes un faila datiem. Faila datu sadaļa var sastāvēt no programmas galvenes tabulas, kurā aprakstīts nulle vai vairāk segmentu, sadaļu galvenes tabulas, kas apraksta nulles vai vairāk sadaļas, kam seko dati, uz kuriem norāda ieraksti no programmas galvenes tabulas, un sadaļu galvenes tabula. Katrā segmentā ir informācija, kas nepieciešama faila izpildes laikā, savukārt sadaļās ir svarīgi dati saistīšanai un pārvietošanai. 1. shēma to ilustrē shematiski.

ELF galvene

ELF galvenes garums ir 32 baiti, un tā identificē faila formātu. Tas sākas ar četru unikālu baitu secību, kas ir 0x7F, kam seko 0x45, 0x4c un 0x46, kas tiek tulkots trīs burtos E, L un F. Starp citām vērtībām galvene norāda arī to, vai tas ir ELF fails 32 vai 64 bitu formātam, vai tas izmanto maz vai lielu endianitāti, parāda ELF versiju, kā arī to, kurai operētājsistēmai fails tika apkopots, lai mijiedarbotos ar pareizā lietojumprogrammas binārā saskarne (ABI) un procesoru instrukciju kopa.

Binārā faila pieskāriena hexdump izskatās šādi:

.2. saraksts: binārā faila hexdump

$ hd / usr / bin / touch | galva -5
00000000 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 |.ELF… |
00000010 02 00 3e 00 01 00 00 00 e3 25 40 00 00 00 00 00 |…>…% @… |
00000020 40 00 00 00 00 00 00 00 28 e4 00 00 00 00 00 00 | @… (… |
00000030 00 00 00 00 40 00 38 00 09 00 40 00 1b 00 1a 00 | [E-pasts aizsargāts] @… |
00000040 06 00 00 00 05 00 00 00 40 00 00 00 00 00 00 00 | [e-pasts aizsargāts] |

Debian GNU / Linux piedāvā komandu readelf, kas paredzēta GNU paketē 'binutils'. Pārslēdzēja -h (īsā versija “-file-header”) pavadījumā tas labi parāda ELF faila galveni. 3. saraksts to parāda komandas pieskārienam.

.3. saraksts: ELF faila galvenes parādīšana

$ readelf -h / usr / bin / touch
ELF galvene:
Maģija: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
Klase: ELF64
Dati: 2 papildinājums, mazs endijs
Versija: 1 (pašreizējā)
OS / ABI: UNIX - V sistēma
ABI versija: 0
Tips: EXEC (izpildāms fails)
Mašīna: Advanced Micro Devices X86-64
Versija: 0x1
Ieejas punkta adrese: 0x4025e3
Programmas galvenes sākums: 64 (baiti failā)
Sadaļas galvenes sākums: 58408 (baiti failā)
Karogi: 0x0
Šīs galvenes izmērs: 64 (baiti)
Programmas galvenes: 56 (baiti)
Programmas galvenes: 9
Sadaļas galvenes lielums: 64 (baiti)
Sadaļu virsrakstu skaits: 27
Sadaļas galvenes virknes tabulas indekss: 26

Programmas galvene

Programmas galvene parāda izpildes laikā izmantotos segmentus un norāda sistēmai, kā izveidot procesa attēlu. 2. saraksta galvene parāda, ka ELF fails sastāv no 9 programmu galvenēm, kuru lielums ir 56 baiti, un pirmā galvene sākas ar 64 baitu.

Atkal komanda readelf palīdz iegūt informāciju no ELF faila. Slēdzis -l (saīsinājums no programmas galvenēm vai -segmentiem) atklāj sīkāku informāciju, kā parādīts 4. sarakstā.

.4. saraksts: parāda informāciju par programmas galvenēm

$ readelf -l / usr / bin / touch
Elf faila tips ir EXEC (izpildāms fails)
Ieejas punkts 0x4025e3
Ir 9 programmu galvenes, sākot ar 64. nobīdi
Programmas galvenes:
Tips Offset VirtAddr PhysAddr
FileSiz MemSiz karodziņi jāsaskaņo
PHDR 0x000000000000000040 0x0000000000400040 0x0000000000400040
0x00000000000001f8 0x00000000000001f8 R E 8
INTERP 0x0000000000000238 0x0000000000400238 0x0000000000400238
0x000000000000001c 0x000000000000001c R 1
[Pieprasot programmas tulku: / lib64 / ld-linux-x86-64.tātad.2]
LOAD 0x000000000000000000 0x000000000000400000 0x0000000000400000
0x000000000000d494 0x000000000000d494 R E 200000
LOAD 0x00000000000000de10 0x000000000060601010 0x0000000000606010
0x0000000000000524 0x0000000000000748 RW 200000
DYNAMIC 0x00000000000000de28 0x00000000006060de28 0x00000000006060de28
0x00000000000001d0 0x00000000000001d0 RW 8
PIEZĪME 0x0000000000000254 0x0000000000400254 0x0000000000400254
0x0000000000000044 0x0000000000000044 R 4
GNU_EH_FRAME 0x000000000000bc40 0x000000000040bc40 0x000000000040bc40
0x00000000000003a4 0x00000000000003a4 R 4
GNU_STACK 0x000000000000000000 0x000000000000000000 0x000000000000000000
0x0000000000000000 0x0000000000000000 RW 10
GNU_RELRO 0x00000000000000de10 0x00000000000060de10 0x0000000000606010
0x00000000000001f0 0x00000000000001f0 R 1
Sadaļu segmentu kartēšana:
Segmentēt sadaļas…
00
01 .interp
02 .interp .Piezīme.ABI marķējums .Piezīme.gnu.būvējuma ID .gnu.hash .dynsym .dynstr .gnu.versija .gnu.versija_r .rela.din .rela.plt .tajā .plt .tekstu .fini .rodata .eh_frame_hdr .eh_frame
03 .init_array .fini_array .jcr .dinamisks .dabūju .dabūju.plt .dati .bss
04 .dinamisks
05 .Piezīme.ABI marķējums .Piezīme.gnu.būvējuma ID
06 .eh_frame_hdr
07
08 .init_array .fini_array .jcr .dinamisks .dabūju

Sadaļas galvene

Trešā ELF struktūras daļa ir sadaļas galvene. Tas ir paredzēts bināro sadaļu uzskaitīšanai. Slēdzis -S (saīsinājums no sadaļu galvenēm vai sadaļām) uzskaita dažādas galvenes. Runājot par komandu touch, ir 27 sadaļu galvenes, un 5. sarakstā ir redzami tikai pirmie četri no tiem, kā arī pēdējais. Katrā rindā ir sadaļas lielums, sadaļas tips, kā arī tās adrese un atmiņas nobīde.

.5. saraksts: sadaļas detaļas, kuras atklāj paši

$ readelf -S / usr / bin / touch
Ir 27 sadaļu galvenes, sākot ar nobīdi 0xe428:
Sadaļu galvenes:
[Nr] Nosaukuma tips Adreses nobīde
Izmērs EntSize karodziņi Saites informācijas izlīdzināšana
[0] NULL 000000000000000000 00000000
0000000000000000 0000000000000000 0 0 0
[1] .interp PROGBITS 0000000000400238 00000238
000000000000001c 0000000000000000 A 0 0 1
[2] .Piezīme.ABI-tag PIEZĪME 0000000000400254 00000254
0000000000000020 0000000000000000 A 0 0 4
[3] .Piezīme.gnu.build-i PIEZĪME 0000000000400274 00000274


[26] .shstrtab STRTAB 000000000000000000 0000e334
00000000000000ef 0000000000000000 0 0 1
Karogu atslēga:
W (rakstīt), A (piešķirt), X (izpildīt), M (apvienot), S (virknes), l (liels)
I (informācija), L (saišu secība), G (grupa), T (TLS), E (izslēgt), x (nezināms)
O (nepieciešama papildu OS apstrāde) o (OS specifiska), p (specifiska procesoram)

Rīki ELF faila analizēšanai

Kā jūs, iespējams, atzīmējāt no iepriekš minētajiem piemēriem, GNU / Linux tiek papildināts ar daudziem noderīgiem rīkiem, kas palīdz analizēt ELF failu. Pirmais kandidāts, kuru apskatīsim, ir failu lietderība.

fails parāda pamatinformāciju par ELF failiem, ieskaitot instrukciju kopas arhitektūru, kurai paredzēts kods pārvietojamā, izpildāmajā vai koplietojamā objekta failā. 6. sarakstā ir teikts, ka / bin / touch ir 64 bitu izpildāms fails, kas seko Linux standarta bāzei (LSB), ir dinamiski saistīts un veidots GNU / Linux kodola 2. versijai.6.32.

.6. saraksts: pamatinformācija, izmantojot failu

$ file / bin / touch
/ bin / touch: ELF 64 bitu LSB izpildāmā versija, x86-64, 1. versija (SYSV), dinamiski saistīta, tulks / lib64 / l,
priekš GNU / Linux 2.6.32, BuildID [sha1] = ec08d609e9e8e73d4be6134541a472ad0ea34502, noņemts
$

Otrais kandidāts ir gatavs. Tajā tiek parādīta detalizēta informācija par ELF failu. Slēdžu saraksts ir salīdzinoši garš un aptver visus ELF formāta aspektus. Izmantojot slēdzi -n (īss piezīmēm -notes), 7. sarakstā tiek parādītas tikai piezīmju sadaļas, kas pastāv faila pieskārienā - ABI versijas tags un būvēšanas ID bitu virkne.

.7. saraksts: parādiet ELF faila atlasītās sadaļas

$ readelf -n / usr / bin / touch
Parāda piezīmes, kas atrastas faila nobīdē 0x00000254 ar garumu 0x00000020:
Īpašnieka datu lieluma apraksts
GNU 0x00000010 NT_GNU_ABI_TAG (ABI versijas tags)
OS: Linux, ABI: 2.6.32
Parāda piezīmes, kas atrastas faila nobīdē 0x00000274 ar garumu 0x00000024:
Īpašnieka datu lieluma apraksts
GNU 0x00000014 NT_GNU_BUILD_ID (unikāla būvējuma ID bitstringa)
Veidojuma ID: ec08d609e9e8e73d4be6134541a472ad0ea34502

Ņemiet vērā, ka zem Solaris un FreeBSD utilīta elfdump [7] atbilst readelf. Kopš 2019. gada kopš 2003. gada nav bijis jauna laidiena vai atjauninājuma.

Trīs numurs ir pakete ar nosaukumu elfutils [6], kas ir pilnībā pieejama Linux. Tas nodrošina alternatīvus rīkus GNU Binutils un ļauj arī validēt ELF failus. Ņemiet vērā, ka visi pakotnē norādīto utilītu nosaukumi “elf utils” sākas ar eu.

Visbeidzot mēs pieminēsim objdump. Šis rīks ir līdzīgs pašam, bet koncentrējas uz objektu failiem. Tas nodrošina līdzīgu informācijas diapazonu par ELF failiem un citiem objektu formātiem.

.8. saraksts: faila informācija, ko iegūst objdump

$ objdump -f / bin / touch
/ bin / touch: faila formāts elf64-x86-64
arhitektūra: i386: x86-64, karodziņi 0x00000112:
EXEC_P, HAS_SYMS, D_PAGED
sākuma adrese 0x00000000004025e3
$

Ir arī programmatūras pakete ar nosaukumu “elfkickers” [9], kas satur rīkus, lai lasītu ELF faila saturu, kā arī ar to manipulētu. Diemžēl izlaidumu skaits ir diezgan mazs, un tāpēc mēs to vienkārši pieminam un nerādām citus piemērus.

Kā izstrādātājs tā vietā varat apskatīt “pax-utils” [10,11]. Šis utilītu komplekts nodrošina vairākus rīkus, kas palīdz validēt ELF failus. Piemēram, dumpelf analizē ELF failu un atgriež C galvenes failu ar detalizētu informāciju - skatiet 2. attēlu.

Secinājums

Pateicoties gudra dizaina un izcilas dokumentācijas kombinācijai, ELF formāts darbojas ļoti labi un joprojām tiek izmantots pēc 20 gadiem. Iepriekš parādītie utilīti ļauj ieskatīties ELF failā un ļauj jums saprast, ko programma dara. Šie ir pirmie soļi, lai analizētu programmatūru - laimīgu uzlaušanu!

Saites un atsauces
  • [1] Izpildāms un sasaistāms formāts (ELF), Wikipedia
  • [2] Fuksija OS
  • [3] Izpildāmo failu formātu salīdzinājums, Wikipedia
  • [4] Linux Foundation, atsauces specifikācijas
  • [5] Ciro Santilli: ELF Hello World apmācība
  • [6] elfutils Debian pakotne
  • [7] elfdump
  • [8] Maikls Boelens: ELF failu 101 operētājsistēmā Linux: izpratne un analīze
  • [9] elfkickers
  • [10] Rūdīti / PaX komunālie pakalpojumi
  • [11] pax-utils, Debian pakete
Pateicības

Rakstnieks vēlas pateikties Akselam Bekertam par atbalstu šī raksta sagatavošanā.

Kā palielināt FPS Linux?
FPS apzīmē Kadri sekundē. FPS uzdevums ir izmērīt kadru ātrumu video atskaņošanā vai spēļu izrādēs. Vienkāršos vārdos nepārtrauktu pilnekrāna attēlu s...
Populārākās Oculus App Lab spēles
Ja esat Oculus austiņu īpašnieks, jums ir jāsazinās par sānu ielādi. Sānu ielāde ir process, kurā austiņās tiek instalēts saturs, kas nav veikals. Sid...
10 labākās spēles, kuras spēlēt Ubuntu
Windows platforma ir bijusi viena no dominējošajām spēļu platformām, jo ​​mūsdienās tiek attīstīts milzīgs spēļu skaits, lai atbalstītu Windows. Vai k...