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.
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.
Risposte:
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.
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.
alcune risorse:
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]
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.
ld
documentazione : Di solito l'ultimo passo nella compilazione di un programma è eseguire ld.
NOP
senza-f
(o-fbin
), viene compilato in un singolo byte0x90
, 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 .section
le direttive sono per lo più ignorate e generano solo allineamento.