Essayez de compiler des commandes Linux (pratique de compilation croisée)

Essayez de compiler des commandes Linux (pratique de compilation croisée)

À 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 :

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

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

Démarrez Dccker

$ sudo docker start gcc-ubuntu
$ sudo docker exec -it gcc-ubuntu /bin/bash

Code source des commandes Linux

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!

Debian · GitLab sleepenh

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 code source

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

Compiler

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

Lien dynamique et lien statique

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érifiez les informations du fichier créé

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.

Compiler avec un lien statique

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érifiez les informations du fichier créé (s'il est devenu un lien statique)

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

Essayez de compiler des commandes Linux (pratique de compilation croisée)
Commande Linux
commandes linux
Commande Linux
[Linux] Liste des commandes Linux utilisées dans la pratique
Commandes réseau Linux
Verbaliser les commandes Linux
Commandes utilisateur Linux
Commandes LINUX de base
Diverses commandes Linux
Commandes Linux fréquemment utilisées
Commandes Linux fréquemment utilisées
Commandes Linux fréquemment utilisées
[Linux] Commandes liées aux groupes
Commandes Linux à retenir
Étudier les commandes Linux et la frustration
Essayez la programmation Linux normale, partie 7
Essayez la programmation Linux normale, partie 2
Essayez la programmation Linux normale, partie 3
Essayez la programmation Linux normale, partie 4