ft_malloc
Compilation et utilisation de la bibliothèque
Etape 1 : Compiler la librairie grâce au Makefile
Contrairement à la plupart des projet 42, le makefile ne doit pas produire un executable mais une librairie partageable en .so appelée libft_malloc_$[HOSTTYPE.so](http://hosttype.so/)
Pour la compilation des fichier “.o” :
gcc -Wall -Wextra -Werror -fPIC -c fichier1.c fichier2.c -o fichier1.o fichier2.o -I chemin_vers_fichier_h
Pour la compilation de la librairie :
gcc -Wall -Wextra -Werror -shared fichier1.o fichier2.o -o nom_de_la_librairie
… ainsi qu’un lien symbolique vers cette librairie.
ln -s nom_de_la_librairie nom_du_lien_symbolique
Etape 2 : Compiler un exécutable de test
Pour tester notre malloc, on compile un programme simple en liant notre bibliothèque :
gcc simple_test.c -I inc -L. -lft_malloc
inc : emplacement de malloc.h
Etape 3 : Forcer l’utilisation de notre malloc
Par défaut, tous les programmes utilisent le malloc de la libc.
Pour rediriger les appels vers notre implémentation, on utilise deux variables d’environnement :
export LD_LIBRARY_PATH=$PWD
export LD_PRELOAD=$PWD/libft_malloc.so
LD_LIBRARY_PATHindique où chercher les bibliothèques partagées.LD_PRELOADforce le chargement de notre bibliothèque avant toutes les autres (y compris la libc).
⚠️ Attention : ne pas exécuter ces commandes globalement dans ton terminal, car elles affecteraient toutes les commandes (et la plupart cesseraient de fonctionner).
Pour une exécution sécurisée, il esr possible d’utiliser un script dans un fichier sh, par exemple run.sh:
#!/bin/sh
export LD_LIBRARY_PATH=$PWD
export LD_PRELOAD=$PWD/libft_malloc.so
$@
Ainsi la commande suivante permet de bypass le malloc par défaut uniquement pour notre executable de test.
sh run.sh ./a.out
Ce script applique le LD_PRELOAD uniquement pour le programme donné
Commande récapitulative
Pendant tout le projet je testais mon code avec la commande suivante qui effectue les 3 etapes précedentes en une seule fois :
make && gcc simple_test.c -I inc -L. -lft_malloc && sh run.sh valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes ./a.out
A propos des leaks
Il est possible d’utiliser Valgrind entant que chasseur de leaks. Pour cela il faut compiler l’executable de test avec les flags suivants :
gcc -g -O0 test.c
Et lancer l’exécutable avec cette commande :
valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes ./main
Cependant, il faut noter que Valgrind utilise lui-même des appels à malloc et calloc. Si notre malloc est activé via LD_PRELOAD, Valgrind peut se retrouver à analyser son propre fonctionnement, ce qui entraîne souvent des faux positifs ou des comportements inattendus.
💡 Pour des tests précis, il est donc recommandé de :
- exécuter Valgrind sans
LD_PRELOADpour tester ton code utilisateur,- et avec
LD_PRELOADuniquement pour vérifier le comportement général dumalloc(pas pour mesurer les leaks).