57 votes

Comment compiler en croisant pour ARM?

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

57voto

Maratyszcza Points 671

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

11voto

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 :

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 :

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.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X