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)
}