Compilando un banale file C con i flag che hai fornito, tra gcc-4.5
e gcc-4.6
e utilizzando objdump -h
per esaminare l'output, sembra che il file .eh_frame
La sezione è introdotta in gcc-4.6
.
Il ld
lo script che hai fornito non si occupa di quella sezione, e probabilmente dovrebbe. Puoi usare strip -R .eh_frame -R .eh_frame_hdr
per rimuovere quella sezione e altre dai file oggetto prima del collegamento.
Comunque, dato che il linker è lo stesso per entrambe le versioni di gcc, objdump -h
sui file oggetto suggerirà la differenza che causa questo problema.
C'è qualche argomento della riga di comando che disattiverà una funzionalità che potrebbe produrre sezioni più grandi
Sì:se ti interessano le dimensioni, dovresti compilare con -Os
. Il -O3
abilita esplicitamente ottimizzazioni che potrebbero portare a dimensioni di codice maggiori. Poiché il bootloader viene eseguito una volta , utilizzando -O3
poiché è quasi certamente sbagliato.
Modifica:
"L'ottimizzazione nell'assemblaggio non ha senso ...
... e altri oggetti qui..."
È tutto del tuo codice in assembly? In tal caso, il livello di ottimizzazione è davvero privo di significato, ma dovresti essere in grado di confrontare semplicemente l'output da readelf -S vga_pm.S.o
compilato con entrambi i compilatori e vedere esattamente quale le sezioni sono diverse.
Ma sembra più probabile che alcuni dei tuoi oggetti non lo siano in assembly, nel qual caso la differenza tra -O3
e -Os
sarà molto significativo.
GCC aggiunge alcune sezioni di debug indesiderate al suo output binario (usa objdump -h <file>
per vederli), di solito metto quelli che non voglio in un /DISCARD/
rule nei miei script ld per sbarazzarmene :
/DISCARD/ : {
*(.debug_*)
*(.note*)
*(.indent)
*(.comment)
*(.stab)
*(.stabstr)
*(.eh_frame)
}