2017-10-13 5 views
1

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

+0

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

+0

@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? –

+0

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

Répondre

0

riscv64 inconnu elfe-gcc.exe -c hello.c -o bonjour -march = rv32imac -mabi = ILP32 -Os

Cette partie est erronée. Votre gcc tolchain docs dit https://gnu-mcu-eclipse.github.io/toolchain/riscv/

riscv64 inconnu-elf-gcc vs-riscv32 inconnu elf-gcc Avec beaucoup d'architectures et de systèmes pris en charge, GCC recommande préfixer les binaires avec un tuple unique:

<arch>-<vendor>-<os>-<libc/abi>- 

Les préfixes RISC-V actuels pour les chaînes d'outils bare metal sont riscv64-unknown-elf- et riscv32-unknown-elf-.

Eh bien, ne soyez pas déroutés par ces noms malheureux. Le 64 ou 32 attaché à l'architecture ... Cela ne signifie pas non plus que le compilateur produise des binaires RISC-V 64 bits ou 32 bits. En fait, les compilateurs produisent les deux binaires 32/64 bits, basés sur -march et -mabi. Les seules différences sont les valeurs par défaut, lorsque le compilateur est appelé sans que -march et -mabi ne soient explicitement définis sur la ligne de commande.

Essayez d'utiliser riscv32-unknown-Elf-gcc.exe pour compiler des programmes pour la plate-forme de 32 bits RISC-V (avec arc & abi ayant r32 & 32 parties en leur nom), il doit utiliser CRT 32 bits correct des dossiers.

Il y a un certain soutien pour multilib, quand riscv64 recherchera (https://gnu-mcu-eclipse.github.io/toolchain/riscv/#multiple-libraries, https://gnu-mcu-eclipse.github.io/blog/2017/09/13/riscv-none-gcc-v7-1-1-2-20170912-released/, https://gcc.gnu.org/onlinedocs/gccint/Target-Fragment.html MULTILIB_OPTIONS) libs 32 bits, mais quelque chose ne va pas. S'il vous plaît, postez gcc -v .... -o your_program.bin résultats pour compilateur riscv32, compilateur riscv64 et plusieurs combinaisons mars/mabi.

+0

Je peux Je ne trouve nulle part ailleurs une chaine d'outils riscv32-unknown-elf préconstruite (et je n'ai vraiment pas le temps de la construire moi-même). Les bibliothèques sont là dans l'installation standard, il semble juste que gcc.exe n'invoque pas ld.exe correctement ... ou je ne dis pas les bons mots magiques pour l'appeler correctement ld.exe –