Comment puis-je configurer GCC pour la compilation croisée pour le processeur ARM? L'hôte serait sur x86_64 (AMD64 - Ubuntu 12.04) et la cible serait ARM (Raspberry Pi ainsi que Pandaboard - fera des compilations séparées pour chacun)?
Réponses
Trop de publicités?Installez les paquets gcc-arm-linux-gnueabi
et binutils-arm-linux-gnueabi
, puis utilisez simplement arm-linux-gnueabi-gcc
à la place de gcc
pour la compilation.
Vous devez faire attention à la version de Linux et aux binutils que vous avez sur votre système cible. Le plus récent est le hardfloat, dans ce cas vous feriez :
sudo apt-get install gcc-arm-linux-gnueabihf
Cela apporte l'environnement de cross-compilation complet, y compris les binutils.
Pour utiliser ce GCC dans le processus de construction, écrivez :
CC=arm-linux-gnueabihf-gcc make
ARM 64 bits
Pour ARM 64 bits, le préfixe de la chaîne d'outils est aarch64
et son utilisation est la suivante :
sudo apt install gcc-9-aarch64-linux-gnu
aarch64-linux-gnu-gcc -o main.out main.c
Vous pouvez l'essayer avec ce programme hello world en C avec QEMU :
main.c
#include
int main(void) {
puts("hello");
}
et ensuite :
sudo apt install qemu-user
qemu-aarch64 main.out
affichera :
hello
Ensuite, voici quelques astuces pour voir rapidement qu'ARM fonctionne réellement en arrière-plan :
- Le débogage pas à pas avec GDB : https://stackoverflow.com/questions/20590155/how-to-single-step-arm-assembly-in-gdb-on-qemu/51310791#51310791
- Enregistrer les instructions ARM exécutées avec :
qemu-aarch64 -d in_asm,out_asm main.out
https://stackoverflow.com/questions/13005303/how-does-native-android-code-written-for-arm-run-on-x86/44505097#44505097
Testé sur Ubuntu 19.10.
Pour la fiabilité dans des applications sérieuses, le fournisseur d'image disque doit également fournir un compilateur croisé compatible
Alors que vous pouvez installer un compilateur croisé avec apt
de manière pratique, je dois vous prévenir que cela n'est pas nécessairement fiable à moins d'être explicitement pris en charge par le fournisseur d'image.
Si vous choisissez le mauvais compilateur croisé, les problèmes suivants peuvent survenir :
- Le lien dynamique est au mauvais emplacement : https://stackoverflow.com/questions/31929092/trying-to-run-a-cross-compiled-executable-on-target-device-fails-with-no-such-f/49993116#49993116
- Incompatibilité binaire avec la glibc et tout autre bibliothèque que vous liez : https://stackoverflow.com/questions/11107263/how-compatible-are-different-versions-of-glibc
Compilation croisée pour Raspberry PI
Pour le RPI en particulier, les compilateurs croisés fournis sont disponibles à l'adresse : https://github.com/raspberrypi/tools et peuvent être utilisés comme expliqué ici : https://raspberrypi.stackexchange.com/questions/64273/installing-raspberry-pi-cross-compiler/83215#83215
git clone https://github.com/raspberrypi/tools
export PATH="$(pwd)/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin:${PATH}"
printf '#include \nint main() { puts("hello world"); }\n' > hello_world.c
printf '#include \nint main() { std::cout << "hello world" << std::endl; }\n' > hello_world.cpp
arm-linux-gnueabihf-gcc -std=c99 -o hello_world_c hello_world.c
arm-linux-gnueabihf-g++ -std=c++11 -o hello_world_cpp hello_world.cpp
Compilation croisée pour Ubuntu
Si vous souhaitez effectuer une compilation croisée pour Ubuntu arm64, je n'ai jamais réussi à trouver une référence claire sur les compilateurs croisés supportés par chaque version de la distribution : Quels sont les compilateurs croisés officiellement supportés pour les architectures alternatives de serveur Ubuntu comme ARM ?
Buildroot
Mon alternative préférée est de construire votre propre image avec Buildroot : https://stackoverflow.com/questions/47557262/how-to-download-the-torvalds-linux-kernel-master-recompile-it-and-boot-it-wi/49349237#49349237
Cela construit tout à partir des sources, y compris la chaîne d'outils et l'image, et garantit que tout est compatible.