À titre d'exemple de pratique de compilation croisée, créons un programme sur Ubuntu qui s'exécute sous Linux avec un processeur MIPS. Dans le cas des commandes pratiques, les commandes Linux qui peuvent être utilisées normalement ne sont souvent pas des périphériques intégrés, ce qui peut être un problème. Cette fois, c'est un exemple supposant un tel cas.
Notez s'il vous plaît :
Veuillez noter que nous ne garantissons pas le fonctionnement de cette procédure. Parce que le matériel embarqué à exécuter et l'environnement adapté à chacun sont nécessaires.
Nous utiliserons l'environnement présenté dans cet article, veuillez donc préparer l'environnement en consultant l'article. Création d'un environnement de compilation croisée Gcc avec Docker sur Ubuntu de VirtualBox sous Mac
$ sudo docker start gcc-ubuntu
$ sudo docker exec -it gcc-ubuntu /bin/bash
Cette fois, prenez la commande sleepenh comme exemple. C'était facile à trouver, alors je vais l'apporter de Debian. Je ne sais pas si ça va!
Référence: Comment trouver le package contenant la commande (exemple dans Ubuntu) Exécutez la commande sur la machine qui la possède.
root@af48c1a975a2:~# which bash #Vérifiez l'emplacement de la commande
/bin/bash
root@af48c1a975a2:~# dpkg --search /bin/bash #Peut être examiné avec dpkg
bash: /bin/bash
Vous pouvez voir que le package "bash" contient la commande / bin / bash.
Obtenez le package en code source
root@af48c1a975a2:~/dev# mkdir sleepenh #Créer un répertoire de travail
<Veuillez exécuter la méthode d'acquisition et de transfert de fichier dans l'environnement Docker en fonction de votre propre environnement.
sleepenh-master.J'ai un zip
root@af48c1a975a2:~/dev/sleepenh# unzip sleepenh-master.zip
root@af48c1a975a2:~/dev/sleepenh# cd sleepenh-master
Si vous compilez avec Makefaile, il ne sera pas compilé de manière croisée, modifiez donc le Makefile.
root@af48c1a975a2:~/dev/sleepenh/sleepenh-master# vi Makefile
La partie modifiée est l'emplacement de "CC =" et remplacez gcc par mips-linux-gnu-gcc. Vous pouvez maintenant compiler sleepenh pour MIPS sur votre PC. (Compilation croisée)
Q ?= @
ifneq ($(Q),@)
Q :=
endif
CC = mips-linux-gnu-gcc
CFLAGS = -std=gnu11 -Wall -Wextra -O2 $(EXTRA_CFLAGS)
<< Omis ci-dessous >>
faire
root@af48c1a975a2:~/dev/sleepenh/sleepenh-master# make
/bin/sh: 1: git: not found
mips-linux-gnu-gcc -std=gnu11 -Wall -Wextra -O2 -DVCSVERSION='' sleepenh.c -o sleepenh
gzip -9 < sleepenh.1 > sleepenh.1.gz
root@af48c1a975a2:~/dev/sleepenh/sleepenh-master# ls
Makefile Makefile.org changelog debian sleepenh sleepenh.1 sleepenh.1.gz sleepenh.c
sleepenh a été compilé.
Afin d'écrire facilement un programme, il est important d'utiliser la bibliothèque fournie. Il est également souvent utilisé dans les commandes. À ce stade, s'il y a un problème avec la bibliothèque sur un PC ou un serveur, il est pratique de mettre à jour uniquement la bibliothèque. Par conséquent, il est courant que les programmes compilent pour référencer dynamiquement la bibliothèque (lien dynamique).
Cependant, dans un environnement embarqué, il est pratique de fonctionner dans divers environnements tels qu'aucune bibliothèque ou pas toutes les versions. Par conséquent, afin de corriger la bibliothèque référencée, elle peut être compilée sous la forme d'incorporer la bibliothèque dans le binaire d'exécution (lien statique) afin qu'elle ne soit pas affectée par l'environnement externe.
Si vous compilez gcc avec l'option -static, ce sera un "lien statique", sinon ce sera un "lien dynamique".
Vérifions la commande sleepenh qui a été réellement créée.
root@af48c1a975a2:~/dev/sleepenh/sleepenh-master# file sleepenh
sleepenh: ELF 32-bit MSB executable, MIPS, MIPS-I version 1 (SYSV), dynamically linked, interpreter /lib/ld., for GNU/Linux 3.2.0, with debug_info, not stripped
Vous pouvez voir qu'un fichier exécutable lié dynamiquement a été créé pour MIPS (MIPS, MIPS-I version 1 (SYSV)). Puisqu'il s'agit d'un lien dynamique, cela dépend de l'environnement d'exploitation. Dans certains cas, il peut n'y avoir aucune bibliothèque à laquelle se référer.
Alors, compilons avec un lien statique.
Faites une copie de chaque répertoire et préparez-le pour une comparaison ultérieure.
root@af48c1a975a2:~/dev/sleepenh# cd ~/dev/sleepenh/
root@af48c1a975a2:~/dev/sleepenh# cp -r sleepenh-static sleepenh-static
root@af48c1a975a2:~/dev/sleepenh# cd sleepenh-static
root@af48c1a975a2:~/dev/sleepenh/sleepenh-static# make clean #nettoyer
Modifiez le Makefile pour compiler avec des liens statiques.
root@af48c1a975a2:~/dev/sleepenh/sleepenh-static# vi Makefile
Pour la partie correction, ajoutez "-static" à la place de "CFLAGS =". Vous pouvez maintenant compiler sleepenh pour MIPS avec des liens statiques sur votre PC. (Compilation croisée)
Changer avant
CFLAGS = -std=gnu11 -Wall -Wextra -O2 $(EXTRA_CFLAGS)
Après le changement
CFLAGS = -std=gnu11 -Wall -static -Wextra -O2 $(EXTRA_CFLAGS)
Après le changement
Q ?= @
ifneq ($(Q),@)
Q :=
endif
CC = mips-linux-gnu-gcc
CFLAGS = -std=gnu11 -Wall -static -Wextra -O2 $(EXTRA_CFLAGS)
<< Omis ci-dessous >>
faire
root@af48c1a975a2:~/dev/sleepenh/sleepenh-static# make
/bin/sh: 1: git: not found
mips-linux-gnu-gcc -std=gnu11 -Wall -static -Wextra -O2 -DVCSVERSION='' sleepenh.c -o sleepenh
gzip -9 < sleepenh.1 > sleepenh.1.gz
root@af48c1a975a2:~/dev/sleepenh/sleepenh-master# ls
Makefile Makefile.org changelog debian sleepenh sleepenh.1 sleepenh.1.gz sleepenh.c
sleepenh a été compilé.
Vérifions la commande sleepenh qui a été réellement créée.
sleepenh: ELF 32-bit MSB executable, MIPS, MIPS-I version 1 (SYSV), statically linked, for GNU/Linux 3.2.0, with debug_info, not stripped
Vous pouvez voir qu'un fichier exécutable lié statiquement a été créé pour MIPS (MIPS, MIPS-I version 1 (SYSV)). S'il s'agit d'un lien statique, il fonctionnera quel que soit l'environnement d'exploitation. Dans certains cas, il peut n'y avoir aucune bibliothèque à laquelle se référer, mais ce n'est pas un problème.
Prenez la personne compilée avec ce lien statique vers le périphérique MIPS Linux et testez l'opération.
Recommended Posts