Apa perbedaan antara file ELF dan file bin?

99

Gambar akhir yang dihasilkan oleh pelengkap berisi file bin dan file ELf format loader yang diperluas, apa perbedaan antara keduanya, terutama utilitas file ELF.

Manik Mahajan
sumber
Inilah yang dikatakan NASM . Bukan khusus ARM, tetapi kemungkinan besar konsepnya sama. Misalnya, jika Anda mengompilasi file yang berisi hanya NOPtanpa -f(atau -fbin), file tersebut akan dikompilasi menjadi satu byte 0x90, bukan kontainer ELF 400 byte dengan -felf32. Jadi hanya kode mentahnya, tidak ada metadata penampung. NASM mengatakan itu sebagian besar digunakan untuk file MS-DOS .COM dan .SYS . sectionarahan sebagian besar diabaikan dan hanya menghasilkan keselarasan.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
Ini adalah salah satu cara di mana file bin dapat berguna: untuk membuat sektor boot untuk menyebarkan sistem operasi: stackoverflow.com/a/32483545/895245
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Jawaban:

94

File Bin adalah file biner murni tanpa perbaikan atau relokasi memori, kemungkinan besar ia memiliki instruksi eksplisit untuk dimuat di alamat memori tertentu. Sedangkan....

File ELF adalah Executable Linkable Format yang terdiri dari pencarian simbol dan tabel yang dapat direlokasi, yaitu, dapat dimuat di alamat memori mana pun oleh kernel dan secara otomatis, semua simbol yang digunakan, disesuaikan dengan offset dari alamat memori itu. dimuat ke. Biasanya file ELF memiliki sejumlah bagian, seperti 'data', 'text', 'bss', untuk menyebutkan beberapa ... itu di dalam bagian-bagian di mana run-time dapat menghitung di mana untuk menyesuaikan referensi memori simbol secara dinamis pada saat run-time.

t0mm13b
sumber
"lebih dari mungkin memiliki instruksi eksplisit untuk dimuat di alamat memori tertentu": apakah ini berarti proses pembuatan file bin menambahkan kode tambahan untuk memuat data ke alamat tertentu?
Penghe Geng
1
Sejauh yang saya pelajari adalah file bin seperti menjalankan program dari offset 0 dan segmen data tertanam di dalamnya. Jika ini salah tolong perbaiki saya.
Martin Kersten
@MartinKersten benar, file bin mulai dari offset 0.
t0mm13b
1
@ t0mm13b Jadi file .elf dapat dibakar ke mikrokontroler seperti file .hex biasa tetapi membutuhkan lebih banyak memori flash, dan setiap kali mikro di-reset, alamat bagian berubah?
Aelgawad
@BlackyDucky, saya tidak percaya itu mungkin. Jika mikrokontroler mencoba mengeksekusi data ELF secara langsung, itu akan salah menafsirkan header dan data lain sebagai instruksi, bukan?
jacobq
40

File bin hanyalah bit dan byte yang masuk ke rom atau alamat tertentu tempat Anda akan menjalankan program. Anda dapat mengambil data ini dan memuatnya secara langsung apa adanya, Anda perlu tahu apa alamat dasarnya karena biasanya tidak ada di sana.

Sebuah file elf berisi informasi bin tetapi dikelilingi oleh banyak informasi lain, kemungkinan info debug, simbol, dapat membedakan kode dari data dalam biner. Memungkinkan lebih dari satu potongan data biner (saat Anda membuang salah satunya ke bin, Anda mendapatkan satu file bin besar dengan data isian untuk dimasukkan ke blok berikutnya). Memberi tahu Anda berapa banyak biner yang Anda miliki dan berapa banyak data bss yang ingin diinisialisasi ke nol (alat gnu mengalami masalah dalam membuat file bin dengan benar).

Format file elf adalah standar, lengan menerbitkan penyempurnaan / variasinya pada standar. Saya merekomendasikan semua orang menulis program parsing elf untuk memahami apa yang ada di sana, jangan repot-repot dengan perpustakaan, cukup sederhana untuk hanya menggunakan informasi dan struktur dalam spesifikasi. Membantu mengatasi masalah gnu pada umumnya membuat file .bin serta men-debug skrip linker dan hal-hal lain yang dapat membantu mengacaukan keluaran bin atau elf Anda.

old_timer
sumber
1
0x7C00 terdengar seperti bootloader yang tidak selalu menggunakan elf. ini adalah pertanyaan umum. sistem operasi akan memiliki aturan untuk ruang alamat (virtual), toolchain perlu ditargetkan pada aturan sistem operasi tersebut, kemudian format file akan menunjukkan item yang dapat dimuat dengan alamat ditambah titik masuk setelah dimuat, ditambah hal-hal lain. elf hanyalah sebuah wadah, seperti sebuah kotak, Anda harus mengemasnya dengan benar untuk kasus penggunaan yang ditargetkan.
old_timer
1
jika Anda ingin mencetak beberapa ascii ke vga, Anda menulis program untuk melakukan itu yang memiliki beberapa data atau secara matematis menghasilkan data dengan cepat atau kombinasi, lalu Anda memuat program itu ke dalam ruang kode yang ditentukan sistem operasi, dan kemudian menjalankan Itu. Anda biasanya tidak memasukkan data langsung ke perangkat fisik, dan ini adalah sistem operasi langka yang memungkinkan Anda melakukannya, atau mengizinkan pemuatnya untuk melakukannya.
old_timer
1
untuk bare metal, khususnya jika file elf ini adalah bootloader dan / atau program pertama kali dijalankan, maka titik masuk dan _start tidak relevan karena Anda menggunakan file elf sebagai batu loncatan ke alat yang memprogram flash (seperti openocd over jtag) atau melalui apapun-apapun-objcopy -O file biner file.elf file.bin dan kemudian file tersebut dimuat ke dalam flashdisk. Tidak pergi dan mencoba bootloader pada x86 tetapi berasumsi bahwa bios tidak dapat mem-parsing file elf sehingga perlu menjadi gambar memori juga. jadi -O file biner tipe bin
old_timer
1
entitas yang terpisah adalah perangkat keras / logika atau desain lainnya. untuk sistem operasi maka sistem operasi yang membuat aturan, untuk mikrokontroler desain chip / prosesor membuat aturan. misalnya jika ada tabel vektor dan kemudian vektor menunjuk ke penangan Anda harus menggulung semua itu ke dalam skrip linker Anda, dll sehingga data yang dapat dimuat ditujukan untuk flash di mana hal itu boot.
old_timer
1
Untuk memperluas bahwa target Anda memiliki aturan baik itu sistem operasi atau prosesor atau bootloader multi-tahap, dll. Dan Anda perlu membangun "biner" Anda berdasarkan aturan tersebut, bootstrap dan skrip tautan menjadi yang paling penting. Kemudian sangat luas untuk setiap target dan bagaimana Anda menerapkan biner itu dan format file apa yang didukung. Dengan asumsi gnu pada sejumlah platform pengembangan host, format file elf adalah keluaran default dan kemudian Anda menggunakan alat yang diperlukan (jika utilitas / pemuat target tertentu) untuk mengekstrak atau mengonversi dari elf ke yang lain.
old_timer
30

beberapa sumber:

  1. ELF untuk arsitektur ARM
    http://infocenter.arm.com/help/topic/com.arm.doc.ihi0044d/IHI0044D_aaelf.pdf
  2. ELF dari wiki
    http://en.wikipedia.org/wiki/Executable_and_Linkable_Format

Format ELF umumnya merupakan keluaran default dari kompilasi. jika Anda menggunakan rantai alat GNU, Anda dapat menerjemahkannya ke format biner dengan menggunakan objcopy, seperti:

  arm-elf-objcopy -O binary [elf-input-file] [binary-output-file]

atau menggunakan utilitas fromELF (meskipun dibangun di sebagian besar IDE seperti ADS):

 fromelf -bin -o [binary-output-file] [elf-input-file]
wenlujon.dll
sumber
6
Ini ditambahkan setelah detail file bin dijawab, dan tidak add-on teknik praktis berguna. 1 untuk itu.
erbdex
-1

Saya hanya ingin mengoreksi satu hal di sini. File ELF diproduksi oleh Linker, bukan oleh compiler.

Misi Compiler berakhir setelah menghasilkan file objek (* .o) dari file kode sumber. Linker menghubungkan semua file .o menjadi satu dan menghasilkan ELF.

Ahmed Gamal
sumber
Tidak disukai karena tidak menjawab pertanyaan atau harus benar. Didefinisikan secara luas, kompilasi mencakup penautan. Dikutip dari lddokumentasinya : Biasanya langkah terakhir dalam menyusun program adalah menjalankan ld.
bzeaman