2.14 Edition des liens 4/5
-
Bibliothèques dynamiques
- Exécution des programmes à liaisons dynamiques :
-
le fichier ELF doit comprendre un segment INTERP ;
- c’est le chargeur dynamique qui est chargé en mémoire :
-
il reçoit un pointeur vers le fichier exécutable ;
- il charge les segments mémoire de l’exécutable ;
- il charge les bibliothèques dynamiques non présentes ;
- il ajoute les segments des bibliothèques dynamiques ...
- ... à l’espace mémoire virtuelle du processus ;
- les repositionnements se font par indirection :
-
avec la "Global Offset Table" pour les variables ;
- avec la "Procedure Linkage Table" pour les fonctions.
- les repositionnements de fonctions sont calculés dynamiquement ...
- ... durant l’exécution : on parle de liaison paresseuse.
- Exercice de création de bibliothèque dynamique
-
créez un fichier libuc.c contenant quelques fonctions ;
- vous pouvez inclure les fonctions ecrire et sortir ;
- compilez le fichier en objet repositionnable avec l’option gcc -fPIC ;
- créez la bibliothèque dynamique avec gcc et l’option -shared ;
- dans un fichier écrivez une fonction _start pour afficher un texte ;
- compilez ce fichier en fichier objet classique ;
- effectuez l’édition des liens avec ld ;
- vérifiez avec ldd que le chargeur dynamique est correct ;
- si ce n’est pas le cas précisez ce chargeur avec l’option -I ;
- ajoutez votre répertoire dans la variable LD_LIBRARY_PATH ;
- vérifiez que votre programme fonctionne en le lançant ;
- lancez ldd sur votre exécutable, pourquoi la libc est listée ?
- affichez la section .dynamic avec readelf -d ;
- quelles informations importantes sont stockées dans cette section ?
- désassemblez l’exécutable avec objdump -d ;
- dans le code de _start vers où pointe l’appel à ecrire ?
- affichez le contenu de .got.plt avec readelf -x ;
- voyez-vous vers où se déroute le saut relatif de ecrire@plt ?
- la fonction du début de la section .plt appelle l’éditeur de lien ;
- quelle résolution va-t-elle être effectuée ? où va être sauvé le résultat ?