Skip to content

Utilisation des Makefile's

HyperLan edited this page Jun 11, 2022 · 12 revisions

Architecture des Makefile's

Les Makefile's sont séparés en plusieurs sections en fonction de leur domaine d'application.

Il y a donc le Makefile :

  • vm/Makefile : Pour l’exécution de la machine virtuelle de test.
  • module/Makefile : Pour la compilation, le chargement et le déchargement du module sur le système hôte.
  • vm/system/Makefile, Pour la compilation du noyau Linux, la création de l'image du système d'exploitation minimal et la compilation du module de la machine virtuelle de test.z
  • Makefile : Wrapper permettant d'appeler tous les sous-Makefile's depuis la racine du projet.

Description des tâches

vm/Makefile : exécution de la machine virtuelle de test

make vm

Cette tâche va se charger de lancer une machine virtuelle de 1Gio de RAM avec qemu. C'est dans cette VM que la magie s'opère !

La VM est constituée :

  • D'un noyau Linux compilé par nos soins (version 5.13.1, avec certains flags de compilations importants pour le debug, notamment des flags pour l'activation de KASAN)
  • D'une image système minimale (avec quasiment aucun paquet d'installé dessus)
  • D'un service de connexion SSH (non utilisé car nous nous connectons directement en via l'interface tty de qemu)
  • Du projet compilé par le noyau linux version 5.13.1
  • Des potentiels fichiers placés dans le dossier dropzone

À noter que des logs de VM sont générés avec tee. Ils sont stockés dans build/vm/logs

make clean

Tous les fichiers générés par le Makefile sont placés dans build/vm. La tâche make clean supprime donc le dossier build/vm.

module/Makefile : compilation du module

make modules

Cette tâche est directement liée aux sous-tâches des Makefile's de Linux. Elle va appeler le Makefile du noyau Linux pour compiler les sources du module.

Les sorties de compilation du modules sont placées dans le dossier build/module.

make load

Cette tâche va charger le module sur le système.

Attention donc à ne pas le faire sur le système hôte si le module est encore instable !

make unload

Il s'agit de la tâche opposée à make load, elle se charge de décharger le module du système.

make clean

Les données de compilation sont créées dans module/ puis déplacées dans le dossier build/module. La tâche clean va donc supprimer le dossier build/module

ainsi que les éventuels résidus dans module/

vm/system/Makefile : Compilation noyau & création image système

make image

Cette tâche va lancer le script vm/system/create-image.sh, qui va se charge de créer de créer une image minimale basée sur Debian.

make kernel

Cette tâche va télécharger le code source du noyau Linux et le compiler avec les flags :

CONFIG_KCOV=y
CONFIG_DEBUG_INFO=y
CONFIG_KASAN=y
CONFIG_KASAN_INLINE=y

Ces flags permettent d'activer KASAN (Kernel Address Sanitizer) ainsi que d'autres options de débogage.

La compilation du noyau peut prendre pas mal de temps ! Merci d'aller vous faire un ou deux cafés... ☕

make module

Comme la tâche make modules, cette tâche va compiler les sources de notre module pour en sortir un kernel object. La seule différence avec make modules est que cette fois-ci le module sera compilé avec notre noyau précédemment compilé (version 5.13.1). Nous faisons cela afin de pouvoir lancer notre module dans notre machine virtuelle de test.

make clean-module

Les fichiers de compilation du modules (compilé avec le noyau version 5.13.1) sont placés dans build/system/kernel/module. clean-module va donc supprimer le dossier build/system/kernel/module.

make clean-kernel

Le noyau compilé est placé dans build/system/kernel/linux-5.13.1. clean-kernel va donc supprimer le dossier build/system/kernel/linux-5.13.1.

make clean-image

L'image système créée pour la machine virtuelle est placée dans build/system/image. clean-image va donc supprimer build/system/image.

make clean-all

Équivalent de make clean-module et make clean-kernel et make clean-image.

Notez que le dossier build/system sera supprimé.

Makefile : Wrapper des autres Makfile's

make module

Équivalent à make modules dans module/Makefile.

Dans cette tâche, le kernel object initialement placé dans build/module est copié à la racine du projet.

make dependencies

Installe toutes les dépendances nécessaires à la bonne exécution des Makefile's.

L'installation des dépendances ne fonctionne que pour les systèmes possédants les gestionnaires de paquets apt ou pacman. Si la commande échoue, tentez d'installer l'un des deux et de s'assurer qu'ils fonctionnent.

Liste des dépendances :

  • wget servira à télécharger les archives nécessaires
  • Qemu est une machine virtuelle libre qui nous permet de tester dans un environnement sécurisé (qui ne corrompt pas la machine hôte) le module kernel
  • gcc, libguestfs, debootstrap, bison ainsi que libncurses-dev, libelf-dev, libssl-dev permettent d'éditer l'image linux téléchargée, recompiler le kernel à des fins de debug et l'adapter à nos besoins de test

make vm

Équivalent à make vm dans vm/Makefile.

make kernel

Équivalent à make kernel dans vm/system/Makefile.

make kernel-module

Équivalent à make module dans vm/system/Makefile.

make image

Équivalent à make image dans vm/system/Makefile.

make clean-module

Équivalent à make clean dans module/Makefile.

make clean-vm

Équivalent à make clean dans vm/system/Makefile.

make clean-sytem-kernel-module

Équivalent à make clean-module dans vm/system/Makefile.

make clean-system-kernel

Désactivé pour des raisons de sécurité (parce-que la compilation c'est long... et recompiler tout un noyau par erreur c'est triste...)

Équivalent à make clean-kernel dans vm/system/Makefile.

make clean-system-image

Équivalent à make clean-image dans vm/system/Makefile.

make clean-system-all

Équivalent à make clean-all dans vm/system/Makefile.

make clean-all-yes-i-am-sure

Supprime tout le dossier build (ainsi que le kernel object à la racine du projet s'il existe).

À utiliser avec modération !! Parce-que recompiler un noyau ou une image système c'est super long !