GNU/Linux >> Linux Esercitazione >  >> Linux

Il mio bootloader non può essere compilato con gcc 4.6 e 4.7 ... solo 4.5

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

Linux
  1. `find` con `-name` e `-exec` multipli esegue solo le ultime corrispondenze di `-name`?

  2. Taglia con Lvm e Dm-crypt?

  3. Esecuzione dello script con ". ” E con “fonte”?

  4. Perché posso accedere con password parziali??

  5. Come posso controllare la tastiera e il mouse con Python?

Linux which e whoami Command Tutorial per principianti (con esempi)

Puoi usare le ancore ^ $ con Ls?

Cosa puoi fare con un VPS e un Cloud Server?

Come posso verificare quali porte sono occupate e quali porte sono libere sulla mia macchina Linux?

Impossibile rinominare un file il cui nome inizia con un trattino

Come posso utilizzare i caratteri jolly in stile ms-dos con ls e mv?