TP 3 - Make (2) et bibliothèques
Licence 3 Informatique - 2005-2006
PhilippeCollet,
RogerRousseau
Objectifs
- Utiliser les différents types de variables de make.
- Créer un makefile avec des règles implicites et savoir créer ces règles.
- Expérimenter la construction et l'utilisation de bibliothèques statiques et dynamiques
Utilisation de variables
La première partie de ce TP continue directement à la suite du précédent TP.
- Faites une copie du répertoire du TP 2 qui contenait l'application pacman et son makefile dans un répertoire pour le TP 3.
- Reprenez le makefile de pacman et créez une nouvelle version qui utilise les variables suivantes à travers toutes les règles possibles :
CC = gcc
CFLAGS = -c
MOVE = /bin/mv -f
RM = /bin/rm -f
BIN = ${HOME}/bin
OBJS = "a remplacer par les .o"
- Ajoutez et utilisez des variables pour le nom de l'exécutables (EXE), les biblothèques à inclure (INCLUDES) et celles à relier (LIBS). Utilisez aussi LDFLAGS qui doit décrire les options de reliures.
- Rajoutez un test pour savoir si la variable DEBUG est définie. Si elle l'est, ajoutez l'option "-g" aux FLAGS. Testez en positionnant la variable DEBUG sur la ligne de commande.
- Définissez une variable SOURCES qui contient le nom de tous les fichiers du répertoire courant qui se terminent par *.c.
- Définissez maintenant OBJS comme tous les fichiers de SOURCES transformés en .o
Utilisation de variables automatiques et de règles implicites
- Modifiez le Makefile pour utiliser au maximum les variables automatiques ($@, $^, $<, ...).
- Supprimez les règles explicites de création des 3 fichiers .o. Le makefile fonctionne-t-il toujours ?
- Que se passe-t-il si on fait un "touch" sur un des .h ? Expliquez le phénomène et corrigez le problème.
- Ajoutez les 2 lignes suivantes avant les règles de gestion des .o. Que se passe-t-il et pourquoi ?
.SUFFIXES:
.SUFFIXES: .c .o
- Créez une variable ENTETES qui contient tous les fichiers .h du répertoire courant (même principe que pour la variable SOURCES).
- Créez une cible "print" dont les dépendants sont les fichiers entêtes et sources et qui va afficher la liste des fichiers modifiés depuis sa dernière exécution (utilisez pour cela la bonne variable automatique et un fichier vide du nom de "print" qui va servir de marqueur de date).
- Notez bien qu'à la place de l'affichage, on pourrait utiliser une commande d'impression et que cela permettrait de réimprimer que ce qui a changé depuis la dernière impression !
Création de règles implicites pour la création de documents (à terminer en autonomie)
- Récupérez et décompactez l'archive testLatex.tgz dans un autre répertoire.
- Créez un ensemble de règles implicites pour :
- Construire automatiquement des fichiers .eps à partir de fichiers .fig (ce sont des fichiers créés avec l'utilitaire xfig)
- La commande a utiliser est de la forme :
fig2dev -L eps toto.fig toto.eps
- Construire automatiquement des fichiers .ps à partir de fichiers .tex (ce sont des sources en latex)
- Il faut passer pour cela par l'intermédiaire d'un fichier .dvi créé par la commande latex. Il faut donc utiliser les deux commandes suivantes :
latex monfichier.tex
dvips monfichier.dvi -o monfichier.ps
- N'oubliez pas de mettre à jour .SUFFIXES en conséquence.
- Testez le tout avec les fichiers fournis avec fabriquant le document en ps.
Bibliothèque : construction statique
- Récupérez et décompactez l'archive conversionBiblio.tgzdans un nouveau répertoire dédié à cette partie du TP.
- Compilez séparément les fichiers
convert1.c
et convert2.c
- Construisez une archive nommée
libconvert.a
à partir des deux fichiers .o générés.
- Consultez le contenu de l'archive et vérifiez la présence des deux fichiers.
- Placez l'index dans cet archive avec la commande
ranlib
.
- Obtenez la liste des symboles avec la commande
nm
.
- Compilez séparément le fichier
outils.c
.
- Construisez un exécutable nommé
convert2sens
en un appel à gcc
qui
- compile le fichier
convert2sens.c
- relie le fichier
outils.o
- relie statiquement la bibliothèque
libconvert.a
située dans le répertoire courant.
- Vérifiez le fonctionnement de l'exécutable produit.
- Utilisez la commande file pour obtenir des informations sur l'exécutable. Que remarquez-vous ?
- Reprenez la construction de l'exécutable en forçant toutes les reliures a être statiques.
- Vérifiez avec la commande
file
et observez la taille de l'exécutable. Expliquez le phénomène.
Bibliothèques : construction dynamique
- Décompactez la même archive conversionBiblio.tgz dans un nouveau répertoire pour faire les manipulations dynamiques.
- Compilez séparément les fichiers
convert1.c
et convert2.c
comme vous avez l'habitude de le faire.
- Observez les fichiers .o produits avec la commande
file
. Quelle information est pertinente vis a vis de la reliure dynamique ?
- Est-il nécessaire de compiler les fichiers .o d'une manière spéciale sous Linux pour pouvoir utiliser la reliure dynamique ?
- Construisez une bibliothèque partagée nommée
libconvert.so
à partir de 2 fichiers .o.
- Utilisez la commande
nm
pour obtenir des informations sur les symboles de cette bibliothèque. Que remarquez-vous de particulier ?
- Créez un répertoire
lib
dans votre homedir et déplacez la bibliothèque dans ce répertoire.
- Construisez un exécutable avec un appel à
gcc
- qui compile
convert2sens.c
et outils.c
- et se relie dynamiquement à la bibliothèque
libconvert.so
(utilisez les options -l et -L)
- Exécutez le programme résultant. Que se passe-t-il ?
- Utilisez la commande
ldd
pour afficher les dépendances de l'exécutable vis a vis des bibliothèques partagées. Que constatez-vous ?
- Positionnez la variable
LD_LIBRARY_PATH
correctement, puis exécutez ldd
pour vérifier la résolution des dépendances et enfin, exécutez le programme.
Evolution de la bibliothèque dynamique (à terminer en autonomie)
- Construisez la même bibliothèque dynamique que précédemment, mais utilisez entre autres l'option
-W
pour
- spécifier que le
soname
interne de la bibliothèque est libconvert.so.1
- alors que le nom du fichier généré sera
libconvert.so.1.0.1
- Déplacez la bibliothèque dans votre répertoire
lib
et créez les deux liens symboliques pour que les raccourcis nécessaires à la gestion des versions soient en place.
- Reconstruisez un exécutable du programme de conversion en le reliant avec l'option
-lconvert
.
- Observez avec la commande
ldd
comment les dépendances sont affichées. Qu'en déduisez-vous sur l'utilisation des liens symboliques précédents ?
- Faites une petite modification dans le fichier
convert1.c
(modifiez la chaîne utilisée dans printf pour que la chose soit visible à l'exécution) et générez une nouvelle bibliothèque avec le même soname, mais avec le nom de fichier libconvert.so.1.0.2
.
- Déplacez cette nouvelle bibliothèque dans votre répertoire
lib
.
- Que faut-il faire pour que cette nouvelle version soit prise en compte par le programme de conversion sans le recompiler ? Faites-le.
- Faites maintenant une nouvelle modification du même genre dans le fichier
convert1.c
.
- Générer une nouvelle bibliothèque mais spécifiez
libconvert.so.2
comme soname interne.
- Que faut-il faire pour que l'exécutable de conversion fonctionne avec cette nouvelle bibliothèque ?
--
PhilippeCollet - 08 Feb 2006
to top