Skip to topic | Skip to bottom
Home
Linfo
Linfo.GLEnvtProg0506TP3Correctionr1.1 - 08 Feb 2006 - 13:58 - PhilippeCollettopic end

Start of topic | Skip to actions

TP 3 - Make (2) et bibliothèques (Elements de correction)

Licence 3 Informatique - 2005-2006

PhilippeCollet

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.
    • ar r ...
  • Consultez le contenu de l'archive et vérifiez la présence des deux fichiers.
    • ar t ...
  • Placez l'index dans cet archive avec la commande ranlib.
  • Obtenez la liste des symboles avec la commande nm.
    • nm -s ...
  • 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.
    • gcc convert2sens.c outils.o -L. -lconvert -o convert2sens
  • Vérifiez le fonctionnement de l'exécutable produit.
  • Utilisez la commande file pour obtenir des informations sur l'exécutable. Que remarquez-vous ?
    • l'exécutable utilise la reliure dynamique
  • Reprenez la construction de l'exécutable en forçant toutes les reliures a être statiques.
    • -static ou -Wl,-Bstatic
  • Vérifiez avec la commande file et observez la taille de l'exécutable. Expliquez le phénomène.
    • différence de taille entre reliure statique et dynamique

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 ?
    • Les fichiers sont "relocatable"
  • Est-il nécessaire de compiler les fichiers .o d'une manière spéciale sous Linux pour pouvoir utiliser la reliure dynamique ?
    • non, c'est le comportement par défaut sur la plate-forme GNU linux
  • Construisez une bibliothèque partagée nommée libconvert.so à partir de 2 fichiers .o.
    • gcc -shared -o libconvert.so ...
  • Utilisez la commande nm pour obtenir des informations sur les symboles de cette bibliothèque. Que remarquez-vous de particulier ?
    • Des références à d'autres bibliothèques
  • 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)
    • gcc convert2sens.c outils.c -L. -lconvert -o convert2sens
  • Exécutez le programme résultant. Que se passe-t-il ?
    • L'exécution échoue, la bibliothèque libconvert.so n'est pas trouvée
  • Utilisez la commande ldd pour afficher les dépendances de l'exécutable vis a vis des bibliothèques partagées. Que constatez-vous ?
    • Deux autres reliures dynamiques ont l'air correctes (elles sont dans les répertoires de recherche par défaut), mais celle de libconvert n'est effectivement pas trouvée.
  • 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.
    • export LD_LIBRARY_PATH=$HOME/lib:$LD_LIBRARY_PATH
    • ldd résout alors toutes les dépendances et l'exécution se passe bien. Il y a bien une différence entre le relieur de gcc et le chargeur ld.so

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
    • option pour gcc : -Wl,-soname,libconvert.so.1 -o 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.
    • ln -s libconvert.so.1.0.1 libconvert.so.1 (raccourci avec le soname pour le relieur dynamique)
    • ln -s liconvert.so.1 libconvert.so (raccourci vers le nom de la bibliothèque pour gcc)
  • 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 ?
    • ldd affiche une dépendance avec libconvert.so.1, donc avec le soname interne, d'où l'intérêt du premier lien symbolique
  • 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.
    • ln -s libconvert.so.1.0.2 libconvert.so.1 (le relieur dynamique va utiliser la v1.0.2 lorsqu'il reliera libconvert.so.1)
  • 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 ?
    • Le relieur dynamique cherche un libconvert.so.1 alors qu'on ne dispose que d'une libconvert.so.2, il faut donc créer un lien entre so.1 et so.2 : * ln -s libconvert.so.2 libconvert.so.1

-- PhilippeCollet - 08 Feb 2006
to top


You are here: Linfo > GLEnvtProg0506TP3Correction

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