Qual è la differenza tra file ELF e file bin?


97

Le immagini finali prodotte dai compilatori contengono sia il file bin che il file ELf in formato caricatore esteso, qual è la differenza tra i due, in particolare l'utilità del file ELF.


Questo è ciò che ha da dire NASM . Non specifico per ARM, ma probabilmente lo stesso concetto. Ad esempio, se si compila un file contenente solo NOPsenza -f(o -fbin), viene compilato in un singolo byte 0x90, invece di un contenitore ELF da 400 byte con -felf32. Quindi solo il codice grezzo, nessun metadata del contenitore. NASM dice che è usato principalmente per i file .COM e .SYS di MS-DOS . sectionle direttive sono per lo più ignorate e generano solo allineamento.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Questo è un modo in cui i file bin possono essere utili: per fare un settore di avvio per i sistemi operativi di schieramento: stackoverflow.com/a/32483545/895245
Ciro Santilli郝海东冠状病六四事件法轮功

Risposte:


94

Un file Bin è un file binario puro senza correzioni o riposizionamenti della memoria, molto probabilmente ha istruzioni esplicite da caricare in un indirizzo di memoria specifico. Mentre....

I file ELF sono un formato eseguibile collegabile che consiste in una ricerca di simboli e una tabella rilocabile, cioè può essere caricato a qualsiasi indirizzo di memoria dal kernel e automaticamente, tutti i simboli utilizzati, vengono adattati all'offset da quell'indirizzo di memoria in cui si trova è stato caricato in. Di solito i file ELF hanno un numero di sezioni, come 'dati', 'testo', 'bss', per citarne solo alcuni ... è all'interno di quelle sezioni in cui il tempo di esecuzione può calcolare dove regolare i riferimenti di memoria del simbolo dinamicamente in fase di esecuzione.


"molto probabilmente ha istruzioni esplicite da caricare a un indirizzo di memoria specifico": questo significa che il processo di generazione del file bin aggiunge codice aggiuntivo per caricare i dati a un indirizzo specifico?
Penghe Geng

1
Per quanto ho imparato, il file bin è come eseguire il programma dall'offset 0 e il segmento di dati è incorporato all'interno. Se questo è sbagliato, correggimi.
Martin Kersten

@MartinKersten corretto, i file bin iniziano dall'offset 0.
t0mm13b

1
@ t0mm13b Quindi i file .elf possono essere masterizzati su un microcontrollore proprio come un normale file .hex ma ci vuole più memoria flash e ogni volta che il micro viene resettato, le sezioni indirizzano i cambiamenti?
Aelgawad

@BlackyDucky, non credo che sia possibile. Se un microcontrollore cercasse di eseguire direttamente i dati ELF, interpreterebbe erroneamente le intestazioni e altri dati come istruzioni, giusto?
iX3

40

Un file bin sono solo i bit e i byte che entrano nella rom o un particolare indirizzo da cui eseguirai il programma. Puoi prendere questi dati e caricarli direttamente così come sono, devi sapere qual è l'indirizzo di base perché normalmente non è lì.

Un file elf contiene le informazioni bin ma è circondato da molte altre informazioni, possibili informazioni di debug, simboli, in grado di distinguere il codice dai dati all'interno del binario. Consente più di un blocco di dati binari (quando si scarica uno di questi in un cestino si ottiene un grande file bin con i dati di riempimento per riempirlo al blocco successivo). Ti dice quanto binario hai e quanti dati bss ci sono che vogliono essere inizializzati a zero (gli strumenti gnu hanno problemi a creare correttamente i file bin).

Il formato file elf è uno standard, arm pubblica i suoi miglioramenti / variazioni sullo standard. Consiglio a tutti di scrivere un programma di analisi elf per capire cosa c'è dentro, non preoccuparti di una libreria, è abbastanza semplice usare solo le informazioni e le strutture nelle specifiche. Aiuta a superare i problemi di gnu in generale creando file .bin così come il debug degli script del linker e altre cose che possono aiutare a rovinare l'output di bin o elf.


1
0x7C00 suona come un bootloader che non usa necessariamente elf. questa è una domanda generica. un sistema operativo avrebbe regole per gli spazi degli indirizzi (virtuali), la toolchain dovrebbe essere mirata alle regole di quel sistema operativo, quindi il formato del file indicherà gli elementi caricabili con indirizzi più un punto di ingresso una volta caricati, più altre cose. elf è solo un contenitore, come una scatola, devi imballarlo a destra per il caso d'uso mirato.
old_timer

1
se vuoi stampare alcuni ascii sul vga, scrivi un programma per fare ciò che ha alcuni dati o genera matematicamente i dati al volo o qualche combinazione, quindi carichi quel programma nello spazio codice definito dal sistema operativo, e poi esegui esso. in genere non sposti i dati direttamente in una periferica fisica, ed è il raro sistema operativo che ti consente di farlo comunque, o consente al suo caricatore di farlo.
old_timer

1
per il bare metal, specialmente se questo file elf è il bootloader e / o il primo programma eseguito, il punto di ingresso e _start non sono rilevanti poiché si utilizza il file elf come trampolino di lancio per uno strumento che programma il flash (come openocd su jtag) o tramite qualunque-qualunque-objcopy -O binary file.elf file.bin e poi quel file viene in qualche modo caricato nella flash. Non è andato e ho provato un bootloader su x86, ma presumo che il bios non possa analizzare i file elf, quindi dovrebbe essere anche un'immagine di memoria. quindi un file bin di tipo binario -O
old_timer

1
l'entità separata è l'hardware / logica o altro design. per i sistemi operativi allora il sistema operativo fa le regole, per un microcontrollore il design del chip / processore fa le regole. per esempio, se c'è una tabella vettoriale e poi i vettori puntano ai gestori, devi inserire tutto ciò nello script del linker, ecc. in modo che i dati caricabili siano destinati alla flash da cui la cosa si avvia.
old_timer

1
Per ampliare le regole del tuo obiettivo, che si tratti di un sistema operativo o di un processore o di un bootloader a più fasi, ecc. E devi costruire il tuo "binario" sulla base di queste regole, essendo il bootstrap e il linkerscript i più importanti. Quindi è molto ampio per ogni obiettivo e come applicare quel binario e quali formati di file sono supportati. Supponendo che gnu su un certo numero di piattaforme di sviluppo host, il formato file elf sia l'output predefinito e quindi si utilizzino gli strumenti necessari (se si tratta di utilità / caricatori specifici di destinazione) per estrarre o convertire da elf a qualcos'altro.
old_timer

30

alcune risorse:

  1. ELF per l'architettura ARM
    http://infocenter.arm.com/help/topic/com.arm.doc.ihi0044d/IHI0044D_aaelf.pdf
  2. ELF da wiki
    http://en.wikipedia.org/wiki/Executable_and_Linkable_Format

Il formato ELF è generalmente l'output predefinito della compilazione. se usi le catene di strumenti GNU, puoi tradurle in formato binario usando objcopy, come ad esempio:

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

o utilizzando l'utilità fromELF (incorporata nella maggior parte degli IDE come ADS):

 fromelf -bin -o [binary-output-file] [elf-input-file]

6
Questo è stato aggiunto dopo che il dettaglio del file bin è stato risposto, e fa un add-on una tecnica praticamente utile. +1 per quello.
erbdex

-1

Voglio solo correggere un punto qui. Il file ELF è prodotto dal Linker, non dal compilatore.

La missione del compilatore termina dopo aver prodotto i file oggetto (* .o) dai file del codice sorgente. Linker collega tutti i file .o insieme e produce l'ELF.


Downvoted perché non risponde alla domanda né necessariamente corretta. In generale, la compilazione include il collegamento. Citato dalla lddocumentazione : Di solito l'ultimo passo nella compilazione di un programma è eseguire ld.
bzeaman
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.