Pertanyaan Terapkan enum 32-bit dengan tautan GCC


Saya sedang menulis aplikasi logam telanjang untuk perangkat ARM (tidak ada OS). Saya perlu enums 32-bit, jadi saya mengumpulkan aplikasi dengan -fno-short-enums bendera compiler. Tanpa bendera ini, saya mendapatkan variabel enum (dan memberlakukan ukuran dengan menambahkan tambahan 0xFFFFFFFF nilai untuk setiap enum bukan merupakan pilihan).

Sekarang saya mendapatkan peringatan tautan berikut untuk setiap objek:

c:/gcc-arm-none-eabi/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/bin/ld.exe: warning: ./src/test.o uses 32-bit enums yet the output is to use variable-size enums; use of enum values across objects may fail

Itu hanya peringatan, tidak ada kesalahan. Tetapi apa artinya itu sebenarnya? Bagaimana saya bisa menentukan "output"?

Saya mencoba mengkompilasi ulang newlib dengan bendera di atas untuk memastikan bahwa semua objek menggunakan ukuran enum yang sama, tetapi saya masih mendapatkan peringatan. Apakah ada sesuatu yang saya lewatkan?


4
2018-05-10 10:41


asal


Jawaban:


Saya memiliki jawaban parsial karena saya memiliki pertanyaan yang sama. Masalahnya adalah pesan peringatan dari tautan yang akan muncul dengan penggunaan -fno-short-enum. Pesan menunjukkan bahwa objek target tidak kompatibel. Jadi saya menghabiskan waktu di dunia mencari sekarang untuk mengubah target agar kompatibel.

Tapi bukan itu masalahnya. Compiler gcc akan membuat enum 32-bit secara default !! Jadi opsi ini tidak diperlukan kecuali Anda TIDAK ingin enums 32-bit. Namun, jika Anda menentukan -fno-short-enum Anda akan menerima pesan peringatan. Sayangnya saya tidak tahu mengapa.

Jadi intinya adalah bahwa bendera no-short-enums tidak diperlukan untuk mencapai 32-bit enum. Jika Anda menetapkannya maka Anda akan menerima pesan peringatan.


2
2017-10-12 04:18



Setelah beberapa saat, saya berhasil. Saya membangun kembali seluruh toolchain termasuk compiler dengan bendera ini. Inilah cara yang saya lakukan:

  1. Dapatkan toolchain sumber dari https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads

  2. Tambahkan 3 baris ke beberapa bagian dari naskah build build-toolchain.sh:

    saveenv
    saveenvvar CFLAGS_FOR_TARGET '-fno-short-enums'
      [...build commands...]
    restoreenv
    

    Bagian yang dimodifikasi:

    • Task [III-1] /$HOST_NATIVE/gcc-first/
    • Task [III-2] /$HOST_NATIVE/newlib/
    • Task [III-4] /$HOST_NATIVE/gcc-final/
    • Task [IV-3] /$HOST_MINGW/gcc-final/

    Saya melewatkan bangunan newlib-nano dan gcc-size-libstdcxx.

  3. Jalankan Skrip yang dimodifikasi build-prerequisites.sh dan build-toolchain.sh untuk membangun segalanya.


Setelah itu, kompilator menggunakan mode-enum besar dan linker baik-baik saja dengan objek saya. Tapi sekarang, saya mendapatkan peringatan berlawanan untuk beberapa objek dari newlib (lib_a-mbtowc_r.o, lib_a-svfiprintf.o, lib_a-svfprintf.o, lib_a-vfprintf.o dan lib_a-vfiprintf.o):

c:/gcc-arm-none-eabi/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/bin/ld.exe: warning: c:/gcc-arm-none-eabi/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/lib\libc.a(lib_a-mbtowc_r.o) uses variable-size enums yet the output is to use 32-bit enums; use of enum values across objects may fail

Saya melihat ke dalam makefile objek ini dan mereka secara eksplisit diatur ke variabel-ukuran-enums, sayangnya. Satu-satunya "solusi" untuk ini, adalah menambahkan bendera tautan untuk mematikan peringatan ini:

-XLinker -no-enum-size-warning

Itu dia.


1
2018-04-03 11:57