l2 Système Compte Rendu Tp n5 Programmation c Sous Linux

download l2 Système Compte Rendu Tp n5 Programmation c Sous Linux

of 4

description

tp

Transcript of l2 Système Compte Rendu Tp n5 Programmation c Sous Linux

  • Compte rendu du TP n4 (suite) et TP n5 Programmation C sous Linux

    RAHAL Majda Nafissa - 23/04/2012

    Exercice 1 : 1. On cre un rpertoire TP3 dans le home directory l'aide de :

    mkdirTP32. On recopie le code puis on enregistre le fichier sous le nom test.c3. 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.oobjdumpdtest.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.oOn constate aussi que pour les fonctions, on a :

    test.o test.dyn

    Fonction add

    call29Le systme donne la fonction un nom interne (29) et nous renseigne sur son offset (adresse relative partir du dbut du main).

    call8048421L 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

    call52Pareillement, le nom interne 52 est donn la fonction et on nous informe sur son offset.

    call80482f4Ici 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.

    Ce qui confirme ce qu'on a vu en cours ; savoir que ce n'est qu'au moment de l'tape d'dition de liens que le branchement vers les fonctions externes (issues d'une ou de plusieurs bibliothques) est fait.

    9. Modifions maintenant le programme prcdent pour le rendre modulaire, et ce de la manire suivante :

    page 2

  • add.c#include"add.h"

    intadd(intx,inty){returnx+y;}

    add.h

    intadd(intx,inty);

    test.c#include#include"add.h"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.cEn 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 :

    #VariablesgnralesOBJS=test.oadd.o#touslesfichiersobjetsncessairesla

    constructiondel'excutableEXEC=test #variablecontenantlenomdel'excutableCC=gcc #nomducompilateurutiliser

    #Rglesdeconstructiondel'excutabletest:$(OBJS)

    $(CC)$(OBJS)o$(EXEC)

    #Rglesdeconstructiondesfichiersobjetsadd.o:add.cadd.h

    $(CC)cadd.ctest.o:

    $(CC)ctest.c

    La commande make substituera les variables sus-cites par leurs valeurs dans les

    page 3

  • rgles ou actions. l'excution de cette commande, on aura : make:testestjour.

    13. On cre un fichier sub.c avec le code donn, ainsi qu'un fichier sub.h contenant le prototype de la fonction sub ; savoir : intsub(intx,inty);

    14. On cre une bibliothque statique libarithm.a l'aide de la commande donne (en ayant pris le soin de crer le fichier objet sub.o auparavant).Ceci aura pour effet de crer une archive du nom de libarithm.a, et qui fait office de bibliothque de fonctions arithmtiques.

    15. On refait l'dition de liens avec la bibliothque cre l'instant, comme ceci :gccotestlibstattest.olibarithm.a

    On remarque en excutant le fichier testlibstat que l'on a exactement le mme rsultat que dans la technique prcdente, savoir 3+4=7.

    16. On cre un rpertoire lib dans TP3 comme cela :mkdirTP3/lib

    On y place la bibliothque en question, en excutant mvlibarithm.aTP3/lib

    17. On cre une bibliothque dynamique libarithm.so avec la commande donne. Notons que l'option shared indique que nous voulons produire un objet partag qui peut tre li avec d'autres objets pour former un excutable.

    18. On refait l'dition de liens avec la bibliothque dynamique, ainsi :gccotestlibdyntest.olibarithm.so

    19. L'excution de testlibdyn est impossible, le shell nous signale :./testlibdyn:errorwhileloadingsharedlibraries:libarithm.so:cannotopensharedobjectfile:Nosuchfileordirectory

    Pour remdier ce problme, nous avons besoin d'installer cette librairie au pralable. Pour ce faire, on copie d'abord la librairie dans le rpertoire lib :

    mvlibarithm.soTP3/lib

    Puis, on excute la commande suivante, qui va crer le lien avec la bibliothque dynamique. L'option n sert prciser le rpertoire o se trouve la bibliothque.

    ldconfignTP3/lib

    Enfin, on re-compile notre excutable (avec la mme commande prcdente) mais maintenant, il s'excute sans problmes lorsque l'on tape ./testlibdynet donne le rsultat escompt : 3+4=7.

    page 4