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