header program dan header bagian dalam file ELF

Ini adalah pengulangan pertanyaan tetapi saya tidak dapat dengan cepat menemukan jawaban atas pertanyaan saya. Itu sebabnya menanyakannya.

Beberapa file ELF berisi header program (yang dapat dieksekusi atau lib bersama) yang menjelaskan segmen. Mereka berisi bidang yang disebut alamat virtual dan offset file dan beberapa bidang lainnya.

Ada juga bagian terkait yang menjelaskan "alamat di memori" dan offset file.

Sekarang saya sedikit bingung bagaimana bagian dan segmen saling berhubungan. (Untuk executable yang dikompilasi secara statis dan untuk executable yang dikompilasi secara non-statis.) Apa perbedaan offset file untuk binari yang dikompilasi secara statis? Apakah ada hubungan antara alamat virtual di header program dan alamat memori di header bagian.

Terima kasih


person agent.smith    schedule 14.08.2014    source sumber
comment
Saya sendiri menemukan artikel bagus yang menghilangkan sebagian besar kebingungan saya: mylinuxbook.com/readelf-command   -  person agent.smith    schedule 14.08.2014
comment
Bisakah Anda meringkas apa yang telah Anda pelajari dalam bentuk jawaban atas pertanyaan Anda?   -  person Ross Ridge    schedule 15.08.2014


Jawaban (1)


Bagian adalah wilayah kontinu terkecil pada file. Jadi file ELF dibagi menjadi beberapa bagian. Bagian tidak boleh tumpang tindih, artinya tidak ada byte yang mungkin menjadi bagian dari lebih dari satu bagian. Namun mungkin ada byte yang bukan milik bagian mana pun ("sampah").

Bagian umumnya digunakan untuk tujuan menghubungkan. Mereka berisi bagian-bagian berbeda dari file yang dapat diatur ulang, digabungkan, dll. oleh linker.

Namun file yang dapat dieksekusi juga dapat berisi bagian – untuk mendeskripsikan konten file, dan di mana setiap bagian kode atau data dimulai. Objek bersama juga menggunakan bagian. Itu berisi tabel simbol untuk tautan dinamis & hal-hal seperti itu.

Semua bagian yang terdapat dalam file ELF dijelaskan dalam Tabel Header Bagian, setiap bagian memiliki entri di dalamnya.

Namun untuk membuat sebuah executable, Anda memerlukan sesuatu yang lain: segmen. Ini memberi tahu pemuat bagian file mana yang harus dimuat ke dalam memori dan ke alamat mana. Jadi segmen dipetakan ke dalam ruang memori proses yang dapat dieksekusi. Mereka dapat berisi kode dan juga data, sehingga segmen dapat dibagi lagi menjadi beberapa bagian untuk mencapai hal tersebut. Dan saya rasa itulah jawaban atas pertanyaan Anda.

Segmen yang dapat dimuat dijelaskan dalam Tabel Header Program.

Singkat cerita:
Dalam executable, Anda memiliki segmen, yang dapat dibagi lagi menjadi beberapa bagian. Segmen dimuat ke dalam memori proses. Bagian bersifat opsional, namun dapat membantu membagi lagi segmen atau menjelaskan isinya. Dalam modul yang dapat direlokasi (keluaran kompiler, file .o), yang terjadi adalah sebaliknya: bagian diperlukan, karena bagian tersebut menjelaskan apa yang ada di dalam file dan memungkinkan untuk dihubungkan.


Adapun alamat memori & lainnya:
Pada sistem modern hanya alamat virtual yang penting. Suatu proses ditipu oleh sistem operasi yang berjalan sendirian di memori, dengan seluruh ruang alamat tersedia untuknya (walaupun tidak semua ruang alamat dapat tersedia pada saat yang sama karena keterbatasan memori fisik ). Sistem memetakan alamat virtual ke alamat fisik dengan cepat, secara transparan ke dalam proses.

Alamat fisik tidak digunakan, sehingga dapat dibiarkan nol, namun dapat diatur ke alamat yang sama untuk berjaga-jaga.

person BarbaraKwarc    schedule 04.07.2018