ELF adalah singkatan dari executable and linkable file format.
ELF digunakan sebagai format file standar untuk file objek di Linux. Sebelum ini, format file a.out digunakan sebagai standar, tetapi belakangan ini ELF mengambil alih sebagai standar.
ELF mendukung :
- Prosesor yang berbeda
- Pengodean data yang berbeda
- Kelas mesin yang berbeda
Artikel ini menjelaskan tentang berbagai jenis file Objek ELF dan header ELF.
File Objek ELF
File yang berisi kode yang dikompilasi dikenal sebagai file objek. File Obyek dapat berupa salah satu dari jenis berikut:
1. File yang dapat dipindahkan
Jenis file objek ini berisi data dan kode yang dapat dihubungkan bersama dengan file lain yang dapat dipindahkan untuk menghasilkan biner yang dapat dieksekusi atau file objek bersama. Dalam istilah awam, file relocatable sama dengan file .o yang dihasilkan ketika kita mengkompilasi kode dengan cara berikut:
gcc -Wall -c test.c -o test.o
Jadi test.o yang dihasilkan setelah operasi di atas akan menjadi file yang dapat dipindahkan.
2. File objek bersama
Jenis file objek ini digunakan oleh tautan dinamis untuk menggabungkannya dengan file objek yang dapat dieksekusi dan/atau file bersama lainnya untuk membuat gambar proses yang lengkap. Dalam istilah awam, file objek bersama sama dengan file .so yang dihasilkan ketika kode dikompilasi dengan flag -fPIC dengan cara berikut:
gcc -c -Wall -Werror -fPIC shared.c gcc -shared -o libshared.so shared.o
Setelah dua perintah di atas selesai, file objek bersama libshared.o diproduksi sebagai output.
CATATAN:Untuk mengetahui lebih lanjut tentang pustaka bersama Linux, lihat artikel kami Pustaka bersama Linux
3. File yang dapat dieksekusi
Jenis file objek ini adalah file yang mampu mengeksekusi suatu program saat dijalankan. Dalam istilah awam, itu adalah output dari perintah seperti ini:
gcc -Wall test.c -o test
Jadi, output 'test' akan menjadi executable yang ketika dijalankan akan mengeksekusi logika yang ditulis dalam file test.c.
Jadi, seperti yang dapat disimpulkan dari jenis file objek di atas, file objek berpartisipasi dari pembuatan program hingga eksekusinya atau kita dapat mengatakan dari tahap penautan ke eksekusi (untuk mengetahui lebih banyak tentang tahap kompilasi Linux/GCC, lihat artikel kami Perjalanan program C).
Tajuk ELF
Semua file objek yang dijelaskan di atas bertipe ELF di Linux.
Ini dapat dengan mudah dibuktikan dengan melihat ke masing-masing file ini. Misalnya, saya melihat masing-masing dari tiga file di sistem saya :
File yang dapat dipindahkan:
$ vim func.o ^?ELF^B^A^A^@^@^@^@^@^@^@^@^@^A^@>^@^A^@^@^@^@^@^@^@^@^@^@^@ ^@UHå¿^@^@^@^@è^@^@^@^@¸^@^@^@^@è^@^@^@^@ÉÃ^@^@ Inside func()^@^@GCC: (Ubuntu 4.4.3-4ubuntu5) 4.4.3^@^T^@^@^@^@ ^@^@^@^AzR^@^Ax^P^A^[^L^G^H^A^@^@^\^@^.symtab^@.strtab^@.shstrtab^ @.rela.text^@.data^@.bss^@.rodata^@.comment^@.note.GNU-stack^@.rela.eh_frame ^@^@^@^@^@^@^@^@^@^@^@^@^@
File objek bersama:
$ vim libshared.so ^?ELF^B^A^A^@^@^@^@^@^@^@^@^@^C^@>^@^A^@^@^@ ^@^@^@^@^@^A^@^@^@^F^@^ ^@^@^@^@^@è^A^@^@^@^@^@^@è^A^@^@^@^@^@^@^A^@^@^@^@^@^@^@^D^@^@^@^T^@^@^ @^C^@^@^@GNU^@·YG®z^L^ZÊ7uÈí,?^N^@^@^@^@^C^@^@^@^L^@^@^@
File yang dapat dieksekusi:
$ vim test ^?ELF^B^A^A^@^@^@^@^@^@^@^@^@^B^@>^@^A^@^@^@P@^@^@^@^@^@@^@^@^@^@^@< ^@^@^@D^@^@^^B^@^@^@^@^@^@^A^@^@^@^@^@^@^@/lib64/ld-linux-x86-64.so.2^@^D^ @^@^@^D^@^@^@^T^@^@^@^C^@^@^@GNU^@òÁ}CKbE;ära`6"^O^N\^C^@^@^@
Jadi kita melihat bahwa karena ini adalah file biner jadi tidak banyak yang bisa dipahami kecuali string ELF di awal setiap file. Ini menunjukkan bahwa file-file ini hanya berformat ELF.
Setiap file dimulai dengan header ELF yang cukup banyak memberi tahu organisasi lengkap file. Misalnya, file objek yang dapat dipindahkan dan dibagikan berisi bagian tetapi di ujung lain file yang dapat dieksekusi terdiri dari segmen. Jadi tergantung pada jenis file objek, header ELF memberikan informasi rinci tentang file tersebut.
Sebagian besar dalam kasus file yang dapat dieksekusi, header ELF diikuti oleh tabel header program. Tabel header program membantu dalam membuat gambar proses. Karena membantu dalam membuat gambar proses (yang dibuat setelah menjalankan yang dapat dieksekusi), tabel header program menjadi wajib untuk file yang dapat dieksekusi tetapi opsional untuk file objek yang dapat dipindahkan dan dibagikan.
Berikut susunan header ELF :
#define EI_NIDENT 16 typedef struct { e_ident[EI_NIDENT]; unsigned char e_type; Elf32_Half e_machine; Elf32_Half e_version; Elf32_Word e_entry; Elf32_Addr e_phoff; Elf32_Off e_shoff; Elf32_Off e_flags; Elf32_Word e_ehsize; Elf32_Half e_phentsize; Elf32_Half e_phnum; Elf32_Half e_shentsize; Elf32_Half e_shnum; Elf32_Half e_shstrndx; } Elf32_Ehdr;
Jadi kita melihat bahwa organisasi yang ditunjukkan di atas adalah dalam bentuk struktur. Menjelaskan setiap anggota secara rinci di sini akan membuat segalanya menjadi rumit, jadi mari kita lihat arti dasar dan informasi yang dimiliki oleh setiap anggota struktur ini untuk mendapatkan gambaran tentang bidang tertentu.
1. e_identitas
Seperti yang sudah kita ketahui bahwa format ELF mendukung berbagai kelas mesin, prosesor, dll. Jadi, untuk mendukung semua ini, informasi awal dalam file ELF berisi informasi tentang cara menginterpretasikan file yang tidak bergantung pada prosesor yang menjalankan executable. Array 'e_ident' memberikan informasi yang sama persis :
Name Value Purpose EI_MAG 0 File identification EI_MAG1 1 File identification EI_MAG2 2 File identification EI_MAG3 3 File identification EI_CLASS 4 File class EI_DATA 5 Data encoding EI_VERSION 6 File version EI_PAD 7 Start of padding bytes EI_NIDENT 16 Size of e_ident[]
- EI_MAG Empat byte pertama di atas menyimpan angka ajaib '0x7fELF'.
- EI_CLASS Sebuah ELF dapat memiliki dua kelas, 32 bit atau 64 bit. Ini membuat format file menjadi portabel.
- EI_DATA Anggota ini memberikan informasi tentang penyandian data. Sederhananya, informasi ini memberitahu apakah data dalam format big endian atau little endian.
- EI_VERSION Anggota ini memberikan informasi tentang versi file objek.
- EI_PAD Anggota ini menandai dimulainya byte yang tidak digunakan dalam larik informasi e_indent.
- EI_NIDENT Anggota ini menyediakan ukuran array e_indent. Ini membantu dalam menguraikan file ELF.
2. e_type
Anggota ini mengidentifikasi jenis file objek. Misalnya, file objek dapat berupa jenis berikut:
Name Value Meaning ET_NONE 0 No file type ET_REL 1 Relocatable file ET_EXEC 2 Executable file ET_DYN 3 Shared object file ET_CORE 4 Core file
CATATAN:Daftar di atas tidak lengkap tetapi masih memberikan informasi tentang jenis file objek utama yang dapat dirujuk oleh ELF.
3. e_mesin
Anggota ini memberikan informasi tentang arsitektur yang dibutuhkan file ELF.
Name Value Meaning ET_NONE 0 No machine EM_M32 1 AT&T WE 32100 EM_SPARC 2 SPARC EM_386 3 Intel Architecture EM_68K 4 Motorola 68000 EM_88K 5 Motorola 88000 EM_860 7 Intel 80860 EM_MIPS 8 MIPS RS3000 Big-Endian EM_MIPS_RS4_BE 10 MIPS RS4000 Big-Endian RESERVED 11-16 Reserved for future use
4. Anggota Tambahan
Selain tiga anggota di atas, ia juga memiliki anggota berikut:
- e_version:Anggota ini menyediakan informasi versi file objek ELF.
- e_entry:Anggota ini memberikan informasi alamat virtual dari titik masuk yang harus ditransfer sistem kontrolnya sehingga proses dapat dimulai.
- e_phoff:Anggota ini menyimpan offset ke tabel header program. Informasi ini disimpan dalam bentuk byte. Jika tidak ada tabel header program, informasi yang dikandung oleh anggota ini adalah nol.
- e_shoff:Anggota ini menyimpan offset ke tabel header bagian. Seperti halnya e_phoff, informasi ini juga disimpan dalam bentuk byte dan jika tidak ada tabel header bagian, informasi yang dikandung oleh bidang ini adalah nol.
- e_flags:Anggota ini menyimpan informasi terkait dengan proses flag tertentu.
- e_ehsize:Anggota ini menyimpan informasi yang terkait dengan ukuran header ELF secara byes.
- e_phentsize:Anggota ini menyimpan informasi yang terkait dengan ukuran satu entri dalam tabel header program file objek. Perhatikan bahwa semua entri berukuran sama.
- e_phnum:Anggota ini menyimpan informasi terkait jumlah entri dalam tabel header program.
- e_shentsize:Anggota ini menyimpan informasi yang terkait dengan ukuran satu entri di tabel header bagian. Ukuran direpresentasikan dalam bentuk jumlah byte.
- e_shnum:Anggota ini memberikan informasi terkait jumlah entri dalam tabel header bagian.
Perhatikan bahwa produk dari ephnum dan ephentsize memberikan ukuran total tabel header program dalam byte dan dengan cara yang sama produk dari eshnum dan eshentsize memberikan ukuran total tabel header bagian dalam byte.