ELF

Memahami Format Fail ELF

Memahami Format Fail ELF

Dari Kod Sumber hingga Kod Binari

Pengaturcaraan dimulakan dengan mempunyai idea yang bijak, dan menulis kod sumber dalam bahasa pengaturcaraan pilihan anda, misalnya C, dan menyimpan kod sumber dalam fail. Dengan bantuan penyusun yang mencukupi, misalnya GCC, kod sumber anda diterjemahkan ke dalam kod objek, terlebih dahulu. Akhirnya, penghubung menerjemahkan kod objek ke dalam fail binari yang menghubungkan kod objek dengan perpustakaan yang dirujuk. Fail ini mengandungi arahan tunggal sebagai kod mesin yang difahami oleh CPU, dan dilaksanakan sebaik sahaja program yang disusun dijalankan.

Fail binari yang disebutkan di atas mengikuti struktur tertentu, dan salah satu yang paling biasa bernama ELF yang menyingkat Format yang Dapat Dilaksanakan dan Dapat Dipaut. Ia digunakan secara meluas untuk fail yang dapat dieksekusi, fail objek yang dapat dipindahkan, perpustakaan bersama, dan pembuangan teras.

Dua puluh tahun yang lalu - pada tahun 1999 - projek 86open telah memilih ELF sebagai format fail binari standard untuk sistem Unix dan seperti Unix pada pemproses x86. Nasib baik, format ELF sebelumnya telah didokumentasikan dalam kedua-dua Antaramuka Sistem Aplikasi V, dan Standard Antaramuka Alat [4]. Fakta ini sangat mempermudah perjanjian standardisasi antara pelbagai vendor dan pembangun sistem operasi berasaskan Unix.

Sebab di sebalik keputusan itu adalah reka bentuk ELF - fleksibiliti, kepanjangan, dan sokongan merentas platform untuk format dan ukuran alamat yang berbeza. Reka bentuk ELF tidak terhad pada pemproses, set arahan, atau seni bina perkakasan tertentu. Untuk perbandingan terperinci mengenai format fail yang boleh dilaksanakan, lihat di sini [3].

Sejak itu, format ELF digunakan oleh beberapa sistem operasi yang berbeza. Antara lain, ini termasuk Linux, Solaris / Illumos, Free-, Net- dan OpenBSD, QNX, BeOS / Haiku, dan Fuchsia OS [2]. Selanjutnya, anda akan menemuinya di peranti mudah alih yang menjalankan Android, Maemo atau Meego OS / Sailfish OS serta di konsol permainan seperti PlayStation Portable, Dreamcast, dan Wii.

Spesifikasi tidak menjelaskan peluasan nama fail untuk fail ELF. Yang digunakan adalah pelbagai kombinasi huruf, seperti .kapak, .tong sampah, .bunian, .o, .prx, .kembung, .ko, .begitu, dan .mod, atau tiada.

Struktur Fail ELF

Pada terminal Linux, peri perintah yang memberi anda ringkasan berguna mengenai struktur fail ELF:

Penyenaraian 1: Halaman utama struktur ELF

$ lelaki bunian
ELF (5) Manual Programmer Linux ELF (5)
NAMA
elf - format fail yang Boleh Dieksekusi dan Memautkan (ELF)
SINOPSIS
#sertakan
PENERANGAN
Fail pengepala mentakrifkan format binari boleh dilaksanakan ELF
fail. Di antara fail-fail ini adalah fail boleh laku yang biasa, boleh dipindahkan
fail objek, fail teras dan perpustakaan bersama.
Fail yang boleh dilaksanakan menggunakan format fail ELF terdiri daripada tajuk ELF,
diikuti dengan jadual tajuk program atau bahagian tajuk tajuk, atau kedua-duanya.
Header ELF sentiasa berada pada tahap mengimbangi sifar fail. Program yang
table header dan offset table header bahagian dalam fail adalah
ditakrifkan dalam tajuk ELF. Kedua-dua jadual menerangkan selebihnya
kekhususan fail.

Seperti yang anda lihat dari keterangan di atas, fail ELF terdiri daripada dua bahagian - tajuk ELF, dan data fail. Bahagian data fail boleh terdiri dari tabel tajuk program yang menggambarkan segmen nol atau lebih, tabel tajuk bahagian yang menggambarkan bahagian sifar atau lebih, yang diikuti oleh data yang disebut oleh entri dari tabel tajuk program, dan tabel tajuk bahagian. Setiap segmen mengandungi maklumat yang diperlukan untuk pelaksanaan fail jangka masa, sementara bahagian mengandungi data penting untuk menghubungkan dan penempatan semula. Rajah 1 menggambarkan ini secara skematik.

Pengetua ELF

Tajuk ELF panjangnya 32 bait, dan mengenal pasti format fail. Ia dimulakan dengan urutan empat bait unik iaitu 0x7F diikuti oleh 0x45, 0x4c, dan 0x46 yang diterjemahkan ke dalam tiga huruf E, L, dan F. Di antara nilai-nilai lain, tajuk juga menunjukkan sama ada fail ELF untuk format 32 atau 64-bit, menggunakan endian sedikit atau besar, menunjukkan versi ELF serta sistem operasi yang dikompilasi fail untuk berfungsi dengan antara muka binari aplikasi yang betul (ABI) dan set arahan cpu.

Hexdump sentuhan fail binari kelihatan seperti berikut:

.Penyenaraian 2: Hexdump fail binari

$ hd / usr / bin / sentuhan | kepala -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 | [dilindungi e-mel] @… |
00000040 06 00 00 00 05 00 00 00 40 00 00 00 00 00 00 00 | [dilindungi e-mel] |

Debian GNU / Linux menawarkan arahan readelf yang disediakan dalam pakej 'binutils' GNU. Diiringi oleh switch -h (versi pendek untuk "-file-header") dengan baik memaparkan tajuk fail ELF. Penyenaraian 3 menggambarkan ini untuk sentuhan arahan.

.Penyenaraian 3: Memaparkan tajuk fail ELF

$ readelf -h / usr / bin / sentuhan
Tajuk ELF:
Sihir: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 00
Kelas: ELF64
Data: pelengkap 2, sedikit endian
Versi: 1 (semasa)
OS / ABI: UNIX - Sistem V
Versi ABI: 0
Jenis: EXEC (Fail boleh dilaksanakan)
Mesin: Peranti Mikro Lanjutan X86-64
Versi: 0x1
Alamat tempat masuk: 0x4025e3
Permulaan tajuk program: 64 (bait ke dalam fail)
Permulaan tajuk bahagian: 58408 (bait ke dalam fail)
Bendera: 0x0
Saiz pengepala ini: 64 (bait)
Ukuran tajuk program: 56 (bait)
Bilangan tajuk program: 9
Saiz tajuk bahagian: 64 (bait)
Bilangan tajuk bahagian: 27
Indeks jadual rentetan bahagian: 26

Pengetua Program

Header program menunjukkan segmen yang digunakan pada waktu berjalan, dan memberitahu sistem bagaimana membuat gambar proses. Tajuk dari Penyenaraian 2 menunjukkan bahawa fail ELF terdiri daripada 9 tajuk program yang masing-masing mempunyai ukuran 56 bait, dan tajuk pertama bermula pada bait 64.

Sekali lagi, arahan readelf membantu mengekstrak maklumat dari fail ELF. Switch -l (singkatan dari -program-header atau -segments) mendedahkan lebih banyak perincian seperti yang ditunjukkan dalam Penyenaraian 4.

.Penyenaraian 4: Paparkan maklumat mengenai tajuk program

$ readelf -l / usr / bin / sentuhan
Jenis fail Elf adalah EXEC (Fail boleh laku)
Titik masuk 0x4025e3
Terdapat 9 tajuk program, bermula pada offset 64
Ketua Program:
Taip Offset VirtAddr PhysAddr
FileSiz MemSiz Bendera Sejajar
PHDR 0x0000000000000040 0x0000000000400040 0x0000000000400040
0x00000000000001f8 0x00000000000001f8 R E 8
INTERP 0x0000000000000238 0x0000000000400238 0x0000000000400238
0x000000000000001c 0x000000000000001c R 1
[Meminta jurubahasa program: / lib64 / ld-linux-x86-64.begitu.2]
PINJAMAN 0x0000000000000000 0x0000000000400000 0x0000000000400000
0x000000000000d494 0x000000000000d494 R E 200000
PINJAMAN 0x000000000000de10 0x000000000060de10 0x000000000060de10
0x0000000000000524 0x0000000000000748 RW 200000
DINAMIK 0x000000000000de28 0x000000000060de28 0x000000000060de28
0x00000000000001d0 0x00000000000001d0 RW 8
CATATAN 0x0000000000000254 0x0000000000400254 0x0000000000400254
0x0000000000000044 0x0000000000000044 R 4
GNU_EH_FRAME 0x000000000000bc40 0x000000000040bc40 0x000000000040bc40
0x00000000000003a4 0x00000000000003a4 R 4
GNU_STACK 0x0000000000000000 0x0000000000000000 0x000000000000000000
0x0000000000000000 0x0000000000000000 RW 10
GNU_RELRO 0x000000000000de10 0x000000000060de10 0x000000000060de10
0x00000000000001f0 0x00000000000001f0 R 1
Pemetaan Bahagian ke Segmen:
Bahagian Segmen…
00
01 .interp
02 .jalinan .Nota.Tanda ABI .Nota.gnu.membina-id .gnu.hash .dynsym .dynstr .gnu.versi .gnu.versi_r .rela.dyn .rela.plt .di dalamnya .plt .teks .fini .rodata .eh_frame_hdr .eh_frame
03 .init_array .fini_array .jcr .dinamik .mendapat .mendapat.plt .data .bss
04 .dinamik
05 .Nota.Tanda ABI .Nota.gnu.membina-id
06 .eh_frame_hdr
07
08 .init_array .fini_array .jcr .dinamik .mendapat

Pengetua Bahagian

Bahagian ketiga struktur ELF adalah tajuk bahagian. Ini bertujuan untuk menyenaraikan satu bahagian binari. Suis -S (pendek untuk -seksyen-tajuk atau -seksyen) menyenaraikan tajuk yang berbeza. Untuk arahan sentuhan, terdapat 27 tajuk tajuk, dan Penyenaraian 5 menunjukkan empat daripadanya ditambah yang terakhir, hanya. Setiap baris merangkumi ukuran bahagian, jenis bahagian serta alamat dan ingatannya.

.Penyenaraian 5: Butir-butir bahagian yang dinyatakan oleh pembaca

$ readelf -S / usr / bin / sentuhan
Terdapat 27 tajuk bahagian, bermula dari mengimbangi 0xe428:
Tajuk Bahagian:
[Nr] Jenis Nama Alamat Offset
Saiz EntSize Flags Pautan Maklumat Sejajar
[0] NULL 0000000000000000 00000000
0000000000000000 0000000000000000 0 0 0
[1] .interp PROGBIT 0000000000400238 00000238
000000000000001c 0000000000000000 A 0 0 1
[2] .Nota.CATATAN ABI 0000000000400254 00000254
0000000000000020 0000000000000000 A 0 0 4
[3] .Nota.gnu.bina-i CATATAN 0000000000400274 00000274


[26] .shstrtab STRTAB 0000000000000000 0000e334
00000000000000ef 0000000000000000 0 0 1
Kunci untuk Bendera:
W (tulis), A (peruntukkan), X (jalankan), M (gabungkan), S (rentetan), l (besar)
I (info), L (urutan pautan), G (kumpulan), T (TLS), E (tidak termasuk), x (tidak diketahui)
O (pemprosesan OS tambahan diperlukan) o (khusus OS), p (khusus pemproses)

Alat untuk Menganalisis fail ELF

Seperti yang anda perhatikan dari contoh di atas, GNU / Linux dilengkapi dengan sejumlah alat berguna yang membantu anda menganalisis fail ELF. Calon pertama yang akan kita perhatikan adalah utiliti fail.

fail memaparkan maklumat asas mengenai fail ELF, termasuk arsitektur set instruksi yang mana kode dalam fail objek yang dapat dipindahkan, dieksekusi, atau dikongsi dimaksudkan. Dalam senarai 6 ia memberitahu anda bahawa / bin / touch adalah fail yang boleh dilaksanakan 64-bit mengikuti Pangkalan Piawai Linux (LSB), dipaut secara dinamik, dan dibina untuk kernel GNU / Linux versi 2.6.32.

.Penyenaraian 6: Maklumat asas menggunakan fail

$ fail / tong / sentuhan
/ bin / sentuhan: ELF 64-bit LSB yang dapat dilaksanakan, x86-64, versi 1 (SYSV), dipaut secara dinamik, jurubahasa / lib64 / l,
untuk GNU / Linux 2.6.32, BuildID [sha1] = ec08d609e9e8e73d4be6134541a472ad0ea34502, dilucutkan
$

Calon kedua adalah readelf. Ia memaparkan maklumat terperinci mengenai fail ELF. Senarai suis agak panjang, dan merangkumi semua aspek format ELF. Dengan menggunakan switch -n (singkatan dari -notes) Penyenaraian 7 menunjukkan bahagian nota, hanya, yang terdapat dalam sentuhan fail - tag versi ABI, dan bitstring ID binaan.

.Penyenaraian 7: Paparkan bahagian yang dipilih dari fail ELF

$ readelf -n / usr / bin / sentuhan
Memaparkan nota yang terdapat pada offset fail 0x00000254 dengan panjang 0x00000020:
Huraian saiz Data Pemilik
GNU 0x00000010 NT_GNU_ABI_TAG (teg versi ABI)
OS: Linux, ABI: 2.6.32
Memaparkan nota yang terdapat pada offset fail 0x00000274 dengan panjang 0x00000024:
Huraian saiz Data Pemilik
GNU 0x00000014 NT_GNU_BUILD_ID (rentetan bit ID unik)
ID Pembinaan: ec08d609e9e8e73d4be6134541a472ad0ea34502

Perhatikan bahawa di bawah Solaris dan FreeBSD, utiliti elfdump [7] sesuai dengan readelf. Pada tahun 2019, belum ada rilis atau kemas kini baru sejak tahun 2003.

Nombor tiga adalah pakej bernama elfutils [6] yang tersedia sepenuhnya untuk Linux. Ia menyediakan alat alternatif untuk GNU Binutils, dan juga membolehkan mengesahkan fail ELF. Perhatikan bahawa semua nama utiliti yang disediakan dalam pakej bermula dengan eu untuk 'elf utils'.

Akhir sekali kita akan menyebutkan objdump. Alat ini serupa dengan readelf tetapi memberi tumpuan kepada fail objek. Ini memberikan pelbagai maklumat yang serupa mengenai fail ELF dan format objek lain.

.Penyenaraian 8: Maklumat fail yang diekstrak oleh objdump

$ objdump -f / bin / sentuhan
/ bin / sentuhan: format fail elf64-x86-64
seni bina: i386: x86-64, bendera 0x00000112:
EXEC_P, HAS_SYMS, D_PAGED
alamat mula 0x00000000004025e3
$

Terdapat juga pakej perisian yang disebut 'elfkickers' [9] yang mengandungi alat untuk membaca kandungan fail ELF serta memanipulasinya. Malangnya, jumlah rilis agak rendah, dan itulah sebabnya kami hanya menyebutnya, dan tidak menunjukkan contoh lebih lanjut.

Sebagai pembangun, anda mungkin melihat 'pax-utils' [10,11]. Set utiliti ini menyediakan sebilangan alat yang membantu mengesahkan fail ELF. Sebagai contoh, dumpelf menganalisis fail ELF, dan mengembalikan fail tajuk C yang mengandungi perincian - lihat Gambar 2.

Kesimpulannya

Terima kasih kepada gabungan reka bentuk yang bijak dan dokumentasi yang sangat baik, format ELF berfungsi dengan baik, dan masih digunakan setelah 20 tahun. Utiliti yang ditunjukkan di atas membolehkan anda melihat pandangan tentang fail ELF, dan membolehkan anda mengetahui apa yang sedang dilakukan oleh program. Ini adalah langkah pertama untuk menganalisis perisian - penggodaman gembira!

Pautan dan Rujukan
  • [1] Format Boleh Dilaksanakan dan Boleh Dipautkan (ELF), Wikipedia
  • [2] Fuchsia OS
  • [3] Perbandingan format fail yang boleh dilaksanakan, Wikipedia
  • [4] Yayasan Linux, Spesifikasi yang Dirujuk
  • [5] Ciro Santilli: ELF Hello World Tutorial
  • [6] pakej elfutils Debian
  • [7] elfdump
  • [8] Michael Boelen: 101 fail ELF di Linux: Pemahaman dan Analisis
  • [9] elfkickers
  • [10] Utiliti Hard / PaX
  • [11] pax-utils, pakej Debian
Ucapan terima kasih

Penulis ingin mengucapkan terima kasih kepada Axel Beckert atas sokongannya mengenai penyusunan artikel ini.

Tambahkan isyarat Tetikus ke Windows 10 menggunakan alat percuma ini
Dalam beberapa tahun kebelakangan ini komputer dan sistem operasi telah banyak berkembang. Ada saat ketika pengguna harus menggunakan perintah untuk m...
Mengawal & menguruskan pergerakan tetikus antara beberapa monitor di Windows 10
Pengurus Tetikus Paparan Dwi membolehkan anda mengawal & mengkonfigurasi pergerakan tetikus antara beberapa monitor, dengan memperlahankan pergerakann...
WinMouse membolehkan anda menyesuaikan & meningkatkan pergerakan penunjuk tetikus pada PC Windows
Sekiranya anda ingin meningkatkan fungsi lalai penunjuk tetikus anda gunakan perisian percuma WinMouse. Ia menambah lebih banyak ciri untuk membantu a...