J'ai du mal à faire la compilation de base & lien pour RISCV sur le dernier GCC pour RISCV sur une plate-forme Windows 7-64bit.GCC 7.1.1 RISCV échecs de compilation (lien), incompatibles ABI
Outils installés: 7.1.1-2-20170912-2255 obtenu à partir https://github.com/gnu-mcu-eclipse/riscv-none-gcc/releases/
Plate-forme: Windows 7, 64 bits, pas Cygwin
Programme:
#include <stdint.h>
int32_t iBlahblah;
int main (void)
{
while(1)
iBlahblah++;
return 0;
}
Ligne de commande:
"c:\Program Files\GNU MCU Eclipse\RISC-V Embedded GCC\7.1.1-2-20170912-2255\bin\riscv64-unknown-elf-gcc.exe" -c hello.c -o hello -march=rv32imac -mabi=ilp32 -Os
"c:\Program Files\GNU MCU Eclipse\RISC-V Embedded GCC\7.1.1-2-20170912-2255\bin\riscv64-unknown-elf-gcc.exe" -o hello.elf -march=rv32imac -mabi=ilp32 -Os -Wl,-Map=hello.lst hello.o
Sortie:
c:/program files/gnu mcu eclipse/risc-v embedded gcc/7.1.1-2-20170912-2255/bin/../lib/gcc/riscv64-unknown-elf/7.1.1/../../../../riscv64-unknown-elf/bin/ld.exe: hello.o: ABI is incompatible with that of the selected emulation: target emulation `elf64-littleriscv' does not match `elf32-littleriscv'
c:/program files/gnu mcu eclipse/risc-v embedded gcc/7.1.1-2-20170912-2255/bin/../lib/gcc/riscv64-unknown-elf/7.1.1/../../../../riscv64-unknown-elf/bin/ld.exe: failed to merge target specific data of file hello.o
c:/program files/gnu mcu eclipse/risc-v embedded gcc/7.1.1-2-20170912-2255/bin/../lib/gcc/riscv64-unknown-elf/7.1.1/../../../../riscv64-unknown-elf/lib/rv32imac/ilp32\libg.a(lib_a-exit.o): In function `.L0 ': exit.c:(.text.exit+0x1e): undefined reference to `_exit'
c:/program files/gnu mcu eclipse/risc-v embedded gcc/7.1.1-2-20170912-2255/bin/../lib/gcc/riscv64-unknown-elf/7.1.1/../../../../riscv64-unknown-elf/bin/ld.exe: hello.elf(.text): relocation "iBlahblah+0x0 (type R_RISCV_HI20)" goes out of range
c:/program files/gnu mcu eclipse/risc-v embedded gcc/7.1.1-2-20170912-2255/bin/../lib/gcc/riscv64-unknown-elf/7.1.1/../../../../riscv64-unknown-elf/bin/ld.exe: hello.o: file class ELFCLASS64 incompatible with ELFCLASS32
c:/program files/gnu mcu eclipse/risc-v embedded gcc/7.1.1-2-20170912-2255/bin/../lib/gcc/riscv64-unknown-elf/7.1.1/../../../../riscv64-unknown-elf/bin/ld.exe: final link failed: File in wrong format
collect2.exe: error: ld returned 1 exit status
La grande question est de savoir comment résoudre le problème "L'ABI est incompatible avec celui de l'émulation sélectionnée"? Nous pouvons ignorer les autres problèmes concernant la relocalisation, la sortie, etc. parce que mon environnement de construction plus grand prend soin de cela (il construit pour de nombreuses plateformes, mais pas RISCV pour le moment).
Vous utilisez gcc pour riscv64 et vous voulez le compiler en mode 32 bits. Mais ce gcc ajoutera c libs d'exécution pour le mode 64 bits dans l'étape de liaison (ajouter -v option à gcc pour voir les fichiers crt supplémentaires ajoutés par gcc) et c'est faux (32 elfes Elf et 64 elfes elfes ne peuvent pas être liés ensemble).Vous devez utiliser gcc pour la cible 64 bits avec le mode 64 bits; et gcc pour la cible 32 bits avec le mode 32 bits (en fait vous avez besoin de crt 32 bits, il peut être inclus dans votre gcc, mais il utilise une mauvaise version) – osgx
@osgx La documentation sur https: // gnu-mcu-eclipse .github.io/toolchain/riscv/install/indique que riscv64-unknown-elf-gcc.exe peut cibler à la fois 32bit et 64bit. Comment puis-je lui suggérer de faire les bibliothèques 32 bits? –
Utilisez riscv32-unknown-elf-gcc.exe qui utilisera le chemin correct vers le CRT 32 bits. Comparez la sortie de 'riscv64-unknown-elf-gcc.exe -v ...' avec 'riscv32-unknown-elf-gcc.exe -v ...' pour trouver les répertoires exacts avec CRT. – osgx