GNU/Linux >> Belajar Linux >  >> Linux

Bootloader saya tidak dapat dikompilasi dengan gcc 4.6 dan 4.7 ... hanya 4.5

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

Linux
  1. Dukungan hidup 32-bit:Kompilasi silang dengan GCC

  2. `find` Dengan Banyak `-name` Dan `-exec` Hanya Mengeksekusi Yang Terakhir dari `-name`?

  3. Bisakah Clang mengkompilasi kode dengan GCC yang dikompilasi .a libs?

  1. Bagaimana cara mengatur RPATH dan RUNPATH dengan GCC/LD?

  2. Rasa Linux yang HANYA baris perintah (dan sangat ringan)?

  3. Apa yang dapat dilakukan penyerang dengan Bluetooth dan bagaimana mitigasinya?

  1. Pangkas Dengan Lvm Dan Dm-crypt?

  2. Enkripsi folder di Linux yang hanya dapat didekripsi di OS dan perangkat tertentu

  3. Bagaimana saya bisa menggunakan wildcard gaya ms-dos dengan ls dan mv?