GNU/Linux >> Belajar Linux >  >> Linux

Dasar-dasar Format File Objek ELF Linux (dan Struktur Header ELF)

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.


Linux
  1. Linux – Bagaimana Cara Memeriksa Informasi Struktur Direktori File Unix/linux?

  2. Tip dan trik .htaccess Linux

  3. Contoh Perintah Objcopy Linux untuk Menyalin dan Menerjemahkan File Objek

  1. Sistem File yang Didukung dan Direkomendasikan di Linux

  2. Bagaimana cara menambahkan baris header dan trailer ke file di Linux

  3. glibc:file elf OS ABI tidak valid

  1. Cara Mengarahkan Output ke File dan Stdout di Linux

  2. Bagaimana cara membuka kompresi format file .xz di Linux menggunakan utilitas tar dan xz?

  3. a.out diganti dengan format file ELF?