GNU/Linux >> Znalost Linux >  >> Linux

Můj bootloader nelze zkompilovat s gcc 4.6 a 4.7 ... pouze 4.5

Zkompilováním triviálního souboru C s příznaky, které jste poskytli, mezi gcc-4.5 a gcc-4.6 a pomocí objdump -h pro prozkoumání výstupu se zdá, že .eh_frame sekce je uvedena v gcc-4.6 .

ld vámi poskytnutý skript se o tuto sekci nestará a pravděpodobně by měl. Můžete použít strip -R .eh_frame -R .eh_frame_hdr k odstranění této sekce a dalších ze souborů objektů před propojením.

Každopádně, protože linker je stejný pro obě verze gcc, objdump -h na souborech objektů naznačí rozdíl, který způsobuje tento problém.


Existuje nějaký argument příkazového řádku, který vypne funkci, která může vytvářet větší sekce

Ano:pokud vám záleží na velikosti, měli byste stavět s -Os . -O3 explicitně umožňuje optimalizace, které by mohly vést k větší velikosti kódu. Protože bootloader se spustí jednou pomocí -O3 protože je to téměř jistě špatně.

Upravit:

"Optimalizace v montáži nemá smysl...
... a další objekty zde ..."

Je vše vašeho kódu v sestavení? Pokud ano, úroveň optimalizace skutečně nemá smysl, ale pak byste měli být schopni jednoduše porovnat výstup z readelf -S vga_pm.S.o vytvořené pomocí obou kompilátorů a přesně uvidíte který sekce jsou různé.

Zdá se však pravděpodobnější, že některé z vašich objektů nejsou v sestavě, v takovém případě je rozdíl mezi -O3 a -Os bude docela smysluplné.


GCC přidává do svého binárního výstupu některé nežádoucí sekce ladění (použijte objdump -h <file> abych je viděl), obvykle dávám ty, které nechci, do /DISCARD/ pravidlo v mých starých skriptech, jak se jich zbavit:

/DISCARD/ : {
        *(.debug_*)
        *(.note*)
        *(.indent)
        *(.comment)
        *(.stab)
        *(.stabstr)
        *(.eh_frame)
}

Linux
  1. Co můžete dělat s VPS a cloudovým serverem?

  2. Jak mohu ovládat klávesnici a myš pomocí Pythonu?

  3. Jak otestovat, na kterém portu MySQL běží a zda se k němu lze připojit?

  1. Může Clang kompilovat kód s GCC zkompilovaným .a libs?

  2. Jak nastavit RPATH a RUNPATH s GCC/LD?

  3. Chuť Linuxu, který je POUZE příkazový řádek (a super lehký)?

  1. Co může útočník dělat s Bluetooth a jak by měl být zmírněn?

  2. Šifrovat složku v systému Linux, kterou lze dešifrovat pouze na konkrétním operačním systému a zařízení

  3. Jak mohu použít zástupné znaky stylu ms-dos s ls a mv?