Академический Документы
Профессиональный Документы
Культура Документы
Exercice 1 :
1. On cre un rpertoire TP3 dans le home directory l'aide de :
mkdirTP3
2. On recopie le code puis on enregistre le fichier sous le nom test.c
3. On gnre le code objet avec la commande gccctest.c
Ce qui aura pour effet de crer un fichier test.o contenant le code objet gnr.
4. On fait une dition de liens dynamique du programme en excutant :
gccotest.dyntest.o
Notons que l'dition de liens est une tape indispensable de la cration d'un
excutable, et qui permet de lier les fichiers objets avec les fichiers d'une ou
plusieurs bibliothques.
On distingue 2 types d'dition de liens :
- statique : o le fichier objet et la bibliothque sont lis dans le mme fichier
excutable. On ramne le code complet de la bibliothque et on l'installe dans
l'excutable.
- dynamique : o le fichier objet est li avec la bibliothque, mais n'est pas dans le
mme fichier excutable ; les liens sont tablis lors du lancement de l'excutable.
On mentionne seulement la bibliothque, on ne l'installe pas.
La premire technique nous donne l'avantage de pouvoir utiliser notre excutable
sur n'importe quelle machine (mme si les bibliothques dont nous avons besoin
n'y sont pas installes), mais elle prsente l'inconvnient de la taille (on importe
toute la bibliothque). A contrario, la deuxime nous permet de gagner en espace
mmoire mais ce moment l, nous ne pourrons utiliser notre excutable que sur
les machines o il y a les bibliothques ncessaires.
Par dfaut, l'dition de liens est dynamique lorsque l'on excute notre commande.
L'option o sert renommer l'excutable en test.dyn. Si on ne l'avait pas mise, le
fichier cr serait nomm a.out
5. On affiche les bibliothques partages requises par notre excutable comme ceci :
lddtest.dyn
Ce qui affichera :
linuxgate.so.1=>(0x007b9000)
libc.so.6=>/lib/i386linuxgnu/libc.so.6(0x0040c000)
/lib/ldlinux.so.2(0x006f2000)
linuxgate.so.1 est une bibliothque virtuelle qu'on rajoute pour excuter plus
rapidement les appels systme. so quivaut Shared Object (qui joue le mme rle
que les fichier .dll sous Windows), linux indique qu'elle est cre par le noyau.
/lib/ldlinux.so.2 est le loader dynamique de Linux, et qui s'occupe de
localiser les bibliothques dynamiques dont a besoin le programme et de les
page 1
charger.
6. Ralisation de l'dition de liens statique :
gccstaticotest.stattest.o
Il suffit donc d'ajouter l'option static gcc pour que l'dition de liens soit
statique.
7. Comparaison des tailles des fichiers test.dyn et test.stat :
test.dyn:6,9Ko|test.stat:605Ko
On remarque que l'excutable cr avec une dition de liens statique est cent fois
plus volumineux que celui cr avec une dition de liens dynamique. Ceci est d au
fait que test.stat intgre le code de toutes les bibliothques utilises dans le
programme alors que pour test.dyn on cre un lien vers les bibliothques dont
on a besoin mais on ne les importe pas dans l'excutable.
8. On ouvre 2 terminaux et on visualise le contenu des fichiers test.o et test.dyn
l'aide des commandes suivantes :
objdumpdtest.o
objdumpdtest.dyn
Notons que objdump sert afficher le code objet dsassembl (option d pour
disassemble) de ces fichiers.
On remarque que le code de test.dyn est beaucoup plus long que celui de test.o
On constate aussi que pour les fonctions, on a :
test.o
test.dyn
Fonction add
call29<main+0x29>
Le systme donne la fonction un nom
interne (29) et nous renseigne sur son
offset (adresse relative partir du dbut
du main).
call8048421<add>
L par contre, le symbole a t rsolu : le nom
a t remplac et est maintenant add. On lui a
aussi associ l'adresse effective de la premire
instruction de la fonction.
Fonction printf
call52<main+0x52>
Pareillement, le nom interne 52 est
donn la fonction et on nous informe
sur son offset.
call80482f4<printf@plt>
Ici aussi, le symbole a t rsolu, la fonction a
maintenant le nom printf.
Une adresse effective lui est associe et qui
reprsente l'adresse de la premire instruction
de la fonction par rapport au dbut du
programme.
add.c
#include"add.h"
add.h
test.c
#include<stdio.h>
intadd(intx,inty); #include"add.h"
intadd(intx,inty)
{returnx+y;}
intmain(){
inta=3,b=4,c;
c=add(a,b);
printf("%d+%d=%d\n",
a,b,c);
return0;}
10. La cration de l'excutable test ncessite le fichier objet de add.c, que l'on cre
avec la commande :
gccctest.cadd.c
En ralit, ce n'est qu' l'tape de l'dition de liens que l'on a besoin des 3 fichiers,
car c'est l o sont fait les liens entre le fichiers et les bibliothques. la
compilation, on aurait pu faire gccctest.c, on n'aurait pas eu d'erreur vu que
le compilateur n'a besoin que des prototypes des fonctions (pas encore de leur
code).
11. On cre l'excutable test l'aide de la commande suivante :
gccotesttest.oadd.o
Et on l'excute avec ./test, on obtient comme rsultat :
3+4=7
12. Cration d'un fichier Makefile permettant de construire l'excutable test :
La commande make permet d'automatiser la compilation d'excutables. En effet,
elle se charge de recompiler tous les fichiers (modules d'un programme/projet) qui
ont t modifis. Pour travailler, la commande make a besoin d'un fichier makefile
contenant les actions et dpendances du programme.
Dans le cas de notre programme test, le makefile peut se prsenter de la manire
suivante :
#Variablesgnrales
OBJS=test.oadd.o#touslesfichiersobjetsncessairesla
EXEC=test
CC=gcc
constructiondel'excutable
#variablecontenantlenomdel'excutable
#nomducompilateurutiliser
#Rglesdeconstructiondel'excutable
test:$(OBJS)
$(CC)$(OBJS)o$(EXEC)
#Rglesdeconstructiondesfichiersobjets
add.o:add.cadd.h
$(CC)cadd.c
test.o:
$(CC)ctest.c
La commande make substituera les variables sus-cites par leurs valeurs dans les
page 3
./testlibdyn:errorwhileloadingsharedlibraries:libarithm.so:
cannotopensharedobjectfile:Nosuchfileordirectory
page 4