Format biner selalu dibutuhkan di setiap sistem operasi generik/standar. Hari ini kita akan menggali lebih dalam tentang Linux dan format ELF-nya yang terkenal.
Meskipun demikian, Linux tidak mewajibkan ekstensi untuk file ELF (bisa berupa *.bin, *.so, dan lainnya (bisa tanpa ekstensi apa pun). ekstensi juga)) File Format yang Dapat Dieksekusi & Dapat Ditautkan biasanya digunakan untuk file yang dapat dieksekusi, model kernel, perpustakaan bersama, dump inti, dan file objek.
Selain itu, ELF sangat fleksibel, dan tidak terikat pada prosesor atau set instruksi tertentu. Arsitektur.

Secara umum, file ELF terdiri dari tiga komponen utama (ELF Header, bagian dan segmen). Masing-masing elemen ini memainkan peran berbeda dalam proses penautan/pemuatan executable ELF. Mari kita kenali struktur masing-masing komponen:

Tajuk ELF

Header ELF dilambangkan dengan struktur Elxxx_Ehdr. Terutama, ini berisi informasi umum tentang biner. Definisi bidang struktur ini adalah sebagai berikut:

  • e_ident: Array 16 byte berisi tanda identifikasi tentang file, yang berfungsi untuk memecahkan kode dan menafsirkan konten file. Contoh tanda identifikasi ini meliputi:
    -EI_MAG0–3: Sihir ELF
    - EI_CLASS: Kelas file.
    - EI_DATA: Pengkodean data file.
    - EI_VERSION: Versi file.
    - EI_OSABI: identifikasi OS/ABI.
    - EI_ABIVERSION: versi ABI.
    - EI_PAD: Mulai dari padding byte.
    - EI_NIDENT: Ukuran ei_ident.
  • e_type: Jenis yang dapat dieksekusi.
  • e_machine: Arsitektur file.
  • e_version: Versi file objek.
  • e_entry: Titik masuk aplikasi.
  • e_phoff: File offset dari Tabel Header Program.
  • e_shoff: File offset dari Tabel Header Bagian.
  • e_flags: Tanda khusus prosesor yang dikaitkan dengan file.
  • e_ehsize: Ukuran tajuk ELF.
  • e_phentsize: Ukuran entri Header Program di Tabel Header Program.
  • e_phnum: Jumlah Header Program.
  • e_shentsize: Ukuran entri Header Bagian di Tabel Header Bagian.
  • e_shnum: Jumlah Header Bagian.
  • e_shstrndx: indeks di Tabel Header Bagian yang Menunjukkan Bagian yang didedikasikan untuk nama Bagian yang Ditahan.

Untuk melihat pratinjau bidang ini untuk biner ELF tertentu, kita dapat menggunakan parser ELF pilihan mana pun. Alat umum untuk mengurai file ELF dengan cepat adalah utilitas readelf dari GNU binutils.

Untuk menggunakan readelf sehingga kita dapat menampilkan isi header ELF untuk executable tertentu, kita dapat menggunakan perintah berikut:

readelf -h ‹dapat dieksekusi›

Bagian

Bagian terdiri dari semua informasi yang diperlukan untuk menghubungkan file objek target untuk membangun executable yang berfungsi. (Penting untuk digarisbawahi bahwa bagian diperlukan pada waktu tautan tetapi tidak diperlukan pada waktu proses.) Di setiap ELF yang dapat dieksekusi, terdapat Tabel Header Bagian. Tabel ini adalah larik struktur Elxxx_Shdr, yang memiliki satu entri Elxxx_Shdr per bagian. Definisi bidang struktur ini meliputi:

  • sh_name: indeks nama bagian dalam tabel string header bagian.
  • sh_type: tipe bagian.
  • sh_flags: atribut bagian.
  • sh_addr: alamat virtual bagian.
  • sh_offset: bagian offset dalam disk.
  • sh_size: ukuran bagian.
  • sh_link: indeks tautan bagian.
  • sh_Info: Bagian informasi tambahan.
  • sh_addraalign: perataan bagian.
  • sh_entsize: ukuran entri yang terdapat dalam bagian.

Beberapa bagian umum adalah sebagai berikut:

  • .teks: kode.
  • .data: data yang diinisialisasi.
  • .rodata: menginisialisasi data hanya-baca.
  • .bss: data yang belum diinisialisasi.
  • .plt: PLT (Tabel Tautan Prosedur) (setara dengan IAT).
  • .got: Entri GOT yang didedikasikan untuk variabel global yang terhubung secara dinamis.
  • .got.plt: Entri GOT yang didedikasikan untuk fungsi yang terhubung secara dinamis.
  • .symtab: tabel simbol global.
  • .dinamis: Menyimpan semua informasi yang diperlukan untuk tautan dinamis.
  • .dynsym: tabel simbol yang didedikasikan untuk simbol yang terhubung secara dinamis.
  • .strtab: tabel string bagian .symtab.
  • .dynstr: tabel string bagian .dynsym.
  • .interp: string tertanam RTLD.
  • .rel.dyn: tabel relokasi variabel global.
  • .rel.plt: tabel relokasi fungsi.

Untuk menampilkan bagian menggunakan readelf, kita dapat menggunakan perintah berikut:

readelf -S ‹dapat dieksekusi›

Segmen

Segmen, yang umumnya dikenal sebagai Program Header, memecah struktur biner ELF menjadi potongan-potongan yang sesuai untuk mempersiapkan executable untuk dimuat ke dalam memori. Berbeda dengan Header Bagian, Header Program tidak diperlukan pada linktime.

Di sisi lain, mirip dengan Header Bagian, setiap biner ELF berisi Tabel Header Program yang terdiri dari struktur Elxxx_Phdr tunggal per segmen yang ada. Definisi bidang struktur ini adalah sebagai berikut:

  • p_type: Jenis segmen.
  • p_flags: Menyegmentasikan atribut.
  • p_offset: File offset segmen.
  • p_vaddr: Alamat virtual segmen.
  • p_paddr: Alamat fisik segmen.
  • p_filesz: Ukuran segmen pada disk.
  • p_memsz: Ukuran segmen dalam memori.
  • P_align: penyelarasan segmen dalam memori.

Ada berbagai macam jenis segmen. Beberapa tipe yang umum adalah sebagai berikut

  • PT_NULL: segmen yang belum ditetapkan (biasanya entri pertama Tabel Header Program).
  • PT_LOAD: Segmen yang dapat dimuat.
  • PT_INTERP: Segmen yang menampung bagian .interp.
  • PT_TLS: Segmen Penyimpanan Lokal Thread (Umum dalam biner yang ditautkan secara statis).
  • PT_DYNAMIC: Memegang bagian .dynamic.

Sesuatu yang penting untuk disoroti tentang segmen adalah hanya segmen PT_LOAD yang dimuat ke dalam memori. Oleh karena itu, setiap segmen lainnya dipetakan dalam rentang memori salah satu segmen PT_LOAD.

Seperti disebutkan sebelumnya, bagian bertanggung jawab untuk mengumpulkan semua informasi yang diperlukan untuk menghubungkan file objek tertentu dan membangun sebuah executable yang dibagi menjadi segmen-segmen dengan atribut berbeda oleh Header Program. Pada akhirnya, mereka akan dimuat ke dalam memori.

Untuk bermain lebih banyak dengan file ELF, Linux memberi kita tiga perintah seperti yang ditunjukkan di bawah ini:

readelf: displays information about one or more ELF format object
        files.  The options control what particular information to
        display.

objdump: displays information about one or more object files.
        The options control what particular information to display.
        This information is mostly useful to programmers who are
        working on the compilation tools, as opposed to programmers who
        just want their program to compile and work.

 nm:     lists the symbols from object files objfile.... If no object files
        are listed as arguments, nm assumes the file a.out.

Note : something important to highlight about readelf it performs a similar
       function to objdump but it goes into more detail and it exists
       independently of the BFD library, so if there is a bug in BFD then
       readelf will not be affected.

Referensi & Sumber Daya:

https://www.intezer.com/blog/research/executable-linkable-format-101-part1-sections-segments/
https://medium.com/ax1al/a-brief-introduction -to-executable-linkable-format-1ed9a3fdcc91
https://man7.org/linux/man-pages/man1/readelf.1.html
https://linux.die .net/man/1/objdump
https://linux.die.net/man/1/nm

Terima kasih telah membaca.

Jika Anda memiliki pertanyaan, silakan berkomentar dan, jika Anda ingin melihat lebih banyak artikel serupa, silakan bertepuk tangan 👏👏👏