Skip to topic | Skip to bottom
Home
Linfo
Linfo.GLEnvtProg0506TP3r1.4 - 10 Feb 2006 - 09:00 - PhilippeCollettopic end

Start of topic | Skip to actions

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


You are here: Linfo > GLEnvtProg0506TP3

to top

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