Dengan mengkompilasi file C biasa dengan flag yang Anda berikan, antara gcc-4.5
dan gcc-4.6
, dan menggunakan objdump -h
untuk memeriksa output, tampaknya .eh_frame
bagian diperkenalkan di gcc-4.6
.
ld
skrip yang Anda berikan tidak menangani bagian itu, dan mungkin seharusnya begitu. Anda dapat menggunakan strip -R .eh_frame -R .eh_frame_hdr
untuk menghapus bagian tersebut dan bagian lainnya dari file objek sebelum ditautkan.
Lagi pula, karena penautnya sama untuk kedua versi gcc, objdump -h
pada file objek akan mengisyaratkan perbedaan yang menyebabkan masalah ini.
Apakah ada argumen baris perintah yang akan mematikan fitur yang dapat menghasilkan bagian yang lebih besar
Ya:jika Anda peduli dengan ukuran, Anda harus membuat dengan -Os
. -O3
secara eksplisit memungkinkan pengoptimalan yang dapat menghasilkan ukuran kode yang lebih besar. Karena bootloader mengeksekusi sekali , menggunakan -O3
karena hampir pasti salah.
Sunting:
"Optimasi dalam perakitan tidak ada artinya ...
... dan objek lain di sini ..."
Apakah semuanya kode Anda dalam perakitan? Jika demikian, tingkat pengoptimalan memang tidak ada artinya, tetapi Anda seharusnya dapat dengan mudah membandingkan keluaran dari readelf -S vga_pm.S.o
dibangun dengan kedua kompiler, dan lihat persis yang mana bagian berbeda.
Namun sepertinya beberapa objek Anda tidak dalam perakitan, dalam hal ini perbedaan antara -O3
dan -Os
akan sangat berarti.
GCC menambahkan beberapa bagian debug yang tidak diinginkan ke output binernya (gunakan objdump -h <file>
untuk melihatnya), saya biasanya meletakkan yang tidak saya inginkan di /DISCARD/
aturan dalam skrip ld saya untuk menyingkirkannya :
/DISCARD/ : {
*(.debug_*)
*(.note*)
*(.indent)
*(.comment)
*(.stab)
*(.stabstr)
*(.eh_frame)
}