Skip to topic | Skip to bottom
Home
Linfo
Linfo.GLEnvtProg0708TP3r1.4 - 16 Feb 2008 - 12:46 - NicolasNobelistopic end

Start of topic | Skip to actions

TP 3 - Make (2) et bibliothèques

Licence 3 Informatique - 2007-2008

PhilippeCollet, NicolasNobelis

URL de cette page : http://deptinfo.unice.fr/twiki/bin/view/Linfo/GLEnvtProg0708TP3
URL de l'enseignement : http://deptinfo.unice.fr/twiki/bin/view/Linfo/GLEnvtProg0708

Objectifs

  • Utiliser les différents types de variables de make.
  • Savoir créer un makefile avec des règles implicites.
  • Expérimenter la construction et l'utilisation de bibliothèques statiques et dynamiques .

1.1 Utilisation de variables

La première partie de ce TP est la suite du TP précédent.

  • Faites une copie du répertoire du TP2 qui contenait l'application pacman et son makefile dans un répertoire pour le TP3.
  • 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 = "à remplacer par la liste des .o"

  • Ajoutez et utilisez des variables pour le nom de l'exécutable (EXE), les bibliothèques à inclure (INCLUDES), celles à relier (LIBS) et enfin LDFLAGS qui doit décrire les options de reliure (i.e. endroit où trouver les libs).
  • Rajoutez un test pour savoir si la variable DEBUG est définie : si elle l'est, ajoutez l'option -g aux FLAGS (CFLAGS et _LDFLAGS).
    • Testez en positionnant la variable DEBUG sur la ligne de commande.
  • Définissez une variable SOURCES qui contient la liste 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.

1.2 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 trois 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épendances sont les fichiers ENTETES 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 !

2 Création de règles implicites pour la création de documents (à faire seul)

  • 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 (ces derniers ont été créés avec l'utilitaire xfig)
      • La commande à utiliser est de la forme : fig2dev -L eps toto.fig toto.eps
    • Construire automatiquement des fichiers .ps à partir de fichiers .tex (ces derniers sont des sources 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 en fabriquant le document ps.

3.1 Bibliothèque : construction statique

  • Récupérez et décompactez l'archive conversionBiblio.tgz dans 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é convertir 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 à être statiques.
  • Vérifiez avec la commande file et observez la taille de l'exécutable. Expliquez le phénomène.

3.2 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-à-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 nommé convertir en un appel à gcc qui :
    • compile convert2sens.c et outils.c
    • 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-à-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.

3.3 Évolution de la bibliothèque dynamique (à faire seul)

  • Construisez la même bibliothèque dynamique que précédemment, mais :
    • spécifiez que le soname interne de la bibliothèque est libconvert.so.1 à l'aide de l'option -W
    • le nom du fichier généré devra être 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 liant à cette bibliothèque 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érez 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 ?


-- NicolasNobelis - 16 Feb 2008
to top

I Attachment sort Action Size Date Who Comment
testLatex.tgz manage 5.3 K 07 Feb 2008 - 20:39 NicolasNobelis Archive de l'exercice à faire seul
conversionBiblio.tgz manage 1.0 K 07 Feb 2008 - 20:55 NicolasNobelis Archive des exercices 3.x
corrige03.pdf manage 64.4 K 16 Feb 2008 - 12:46 NicolasNobelis Corrigé du TP3

You are here: Linfo > GLEnvtProg0708 > GLEnvtProg0708TP3

to top

Copyright © 1999-2020 by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding WIKIDeptinfo? Send feedback