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