Vous êtes sur la page 1sur 4

Complment de cours : librairies statiques et dynamiques

Arash Habibi & Frdric Vivien


Ce document porte sur les librairies, leur utilisation et la manire de les gnrer. Pour la ralisation du TP, vous pouvez passer directement la section 2. La section 1 porte sur la nature des chiers objet.

Les chiers objet

Les premires tapes de la compilation, cest--dire toutes celles qui se situent avant celle de ldition de liens, consistent transformer les chiers dits sources (extension .c) en chiers dits objet (extension .o). Prenons par exemple le chier source alloctabint.c suivant :
#include <stdlib.h> int* alloctabint(int nb) { int *tab; tab = (int*)malloc(nb*sizeof(int)); if(tab==NULL) { perror("malloc"); exit(1); } return(tab); } La commande gcc -c alloctabint.c -o alloctabint.o gnre un chier alloctabint.o qui est un chier objet. Les chiers objet contiennent des informations codes en binaire. Ces informations reprsentent le programme contenu dans le chier source dans un format presque excutable. En particulier : si le chier source contient des appels des fonctions qui ne sont pas dnies dans ce chier (dans notre exemple les fonctions malloc, exit, et perror) alors ces appels sont reprsents par des branchements des adresses mmoires restant dterminer ultrieurement ; si le chier source contient des dclarations de variables extern, alors ladresse mmoire de ces variables reste galement indtermine. Par ailleurs, la seule chose qui pourrait manquer un chier objet pour tre un chier excutable part entire, est une fonction main. tant donn un chier objet contenant une fonction main, et des chiers objet o seraient dnies les fonctions exit, malloc et perror, lditeur de liens calcule ladresse mmoire de ces fonctions et les met la disposition de la fonction alloctabint qui pourra alors faire des branchements vers ces fonctions. Lditeur de liens calcule aussi ladresse mmoire de la fonction taballocint. Sil existe des fonctions qui appellent alloctabint, lditeur de lien leur fournira ladresse de cette fonction ce qui leur permettra de faire des branchements vers elle. Enn, aprs ldition de liens, le processeur aura accs ladresse de la fonction main ce qui lui permettra de lancer lexcution du programme.

Les librairies

2.1 Description
Les librairies contiennent la dnition de fonctions susceptibles dtre utilises par plusieurs programmes (simultanment ou non). Il existe deux types de librairies : les librairies statiques et les librairies dynamiques. Le nom des librairies statiques est typiquement de la forme :

lib***.a Par exemple en regardant dans le rpertoire /usr/lib vous trouverez : libc.a est la librairie standard C (fonctions malloc, exit, etc.) ; libm.a est la librairie mathmatique (fonctions sqrt, cos, etc.) ; libjpeg.a est la librairie des fonctions permettant de manipuler les chiers image au format jpeg ; libGL.a est la librairie des fonctions permettant de manipuler des objets 3D ; etc. Le nom des librairies dynamiques est typiquement de la forme : lib***.so Dans le rpertoire /usr/lib vous trouverez galement les versions dynamiques des librairies ci-dessus. Utiliser des librairies statiques, revient inclure la dnition des fonctions de la librairie dans votre chier excutable, pendant ltape de ldition de liens (donc pendant la compilation et avant le lancement du programme). Utiliser des librairies dynamiques, revient indiquer votre programme lemplacement do il pourra charger en mmoire ces dnitions aprs le lancement du programme. Lavantage des librairies statiques est que le chier excutable qui en rsulte contient, avant lexcution, tout ce qui lui est ncessaire pour fonctionner. Alors que, si une librairie dynamique a disparu, ou a t considrablement modie, un programme excutable qui sexcutait parfaitement en utilisant cette librairie peut devenir totalement inoprant. Par contre, un programme obtenu par compilation avec une librairie statique a un chier excutable beaucoup plus volumineux que le mme programme obtenu par compilation avec une librairie dynamique, puisque la dnition des fonctions de la librairie ne se trouve pas dans le chier excutable. Enn, si une librairie statique est mise jour alors, tout programme lutilisant devra tre recompil pour quil puisse prendre en compte la modication. Dans le cas dune librairie dynamique, cette mise jour na pas besoin de recompilation.

2.2
2.2.1

Utilisation
Principe gnral

Soit la librairie libXXX.a (ou libXXX.so) se trouvant dans un rpertoire dont le chemin absolu est chemin. Pour compiler un chier source prog.c faisant appel des fonctions de cette librairie, il faut taper la ligne de commande suivante : gcc prog.c -Lchemin -lXXX -o prog autrement dit, aprs loption -l, il faut mettre le nom de la librairie sans lextension (donc .a , .so) et sans le le prxe lib. Pour la librairie libjpeg.a, loption de compilation est -ljpeg ; pour la librairie libGL.so, loption de compilation est -lGL ; pour la librairie libsocket.so.2, loption de compilation est -lsocket ; et ainsi de suite. Si le programme contient plusieurs chiers source : prog1.c, prog2.c, prog3.c, ..., progn.c, progmain.c, alors il faudra la suite de commandes suivante : gcc -c prog1.c -o prog1.o gcc -c prog2.c -o prog2.o gcc -c prog3.c -o prog3.o ... gcc -c progn.c -o progn.o gcc -c main.c -o main.o gcc prog1.o prog2.o prog3.o ... progn.o main.o -Lchemin -lXXX -o prog On peut aussi simplement excuter : gcc prog1.c prog2.c prog3.c ... progn.c main.c -Lchemin -lXXX -o prog

2.2.2

Exemple

Soit le programme suivant qui calcule et afche la racine carre du nombre quon lui fournit en entre. On utilise pour cela, la fonction sqrt qui a t dni dans le chier libm.a, mais aussi dans le chier libm.so qui se trouvent tous deux dans le rpertoire /usr/lib. Voici le chier prog.c :

#include <math.h> int main() { double in; scanf("%f",&in); printf("%f\n", sqrt(in)); return 0; } Pour compiler ce programme, il faut excuter la commande : gcc prog.c -L/usr/lib -lm -o prog

2.2.3

Diffrence dutilisation des librairies statiques et dynamiques

Dans ce qui prcde, nous navons fait aucune distinction entre les librairies statiques et dynamiques. En effet lutilisation des deux types de librairies est presque identique. Il y a pourtant une petite diffrence : dans le cas des librairies dynamiques, si le programme allait toujours chercher les librairies au mme emplacement, il sufrait de changer cet emplacement pour que le programme devienne inutilisable 1 , ou quil faille le recompiler. Cest pourquoi pour chercher lemplacement des librairies dynamiques, on saide dune variable denvironnement appele LD_LIBRARY_PATH Cette variable indique au programme quels emplacements il doit chercher les librairies dynamiques. Si cet emplacement est modi, il suft de modier la variable, sans changer le programme. Pour indiquer au systme quil faut chercher dans le rpertoire /usr/local/lib, il faudra initialiser la variable LD_LIBRARY_PATH de la manire suivante : export LD_LIBRARY_PATH=/usr/local/lib Si lon veut que les programmes cherchent dans /usr/local/lib, dans /usr/X11R6/lib et dans le rpertoire courant, il faudra crire : export LD_LIBRARY_PATH=.:/usr/X11R6/lib:/usr/local/lib En pratique, vous ne dnirez jamais cette variable mais vous ajouterez des chiers sa dnition : export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/users/profs/habibi/libs

2.3

Cration de librairies

Soient les chiers prog1.c, prog2.c, prog3.c, ..., progn.c contenant des fonctions (autres que main). Nous voulons mettre ces fonctions dans une librairie pour que dautres programmes puissent les utiliser. Dans un premier temps, il est ncessaire de compiler ces chiers pour obtenir des chiers objet (cf. section 1). gcc -c prog1.c -o gcc -c prog2.c -o gcc -c prog3.c -o ... gcc -c progn.c -o prog1.o prog2.o prog3.o progn.o

2.3.1

Cration une librairie statique

Pour crer une librairie statique partir des chiers objet, il faut utiliser la commande ar qui archive ces chiers dans un seul chier. Loption -r permet dinsrer les nouveaux chiers dans larchive. Loption -v (verbose) permet dafcher lcran le nom des chiers insrs. ar -rv libtoto.a prog1.o prog2.o prog3.o ... progn.o La librairie libtoto.a est prte tre utilise dans une compilation.
1 Sous linux, cette variable nest pas prise en compte, il faut que le nom de la librairie se trouve dans le chier /etc/ld.so.conf et que ldconfig ait t lanc aprs la modication de ce chier.

2.3.2

Cration une librairie dynamique

Pour crer une librairie statique partir des chiers objet, on peut utiliser gcc avec loption -shared. gcc -o libtoto.so -shared prog1.o prog2.o prog3.o ... progn.o La librairie libtoto.so est prte tre utilise dans une compilation.

2.3.3

Lemplacement dune librairie

En gnral, on place une librairie (ou un lien vers cette librairie) un emplacement visible par tous les programmes qui sont susceptibles de lutiliser. Typiquement dans : /usr/local/lib si la librairie est susceptible dtre utilise par plusieurs utilisateurs ; ~/lib si la librairie est susceptible dtre utilise par un seul utilisateur. Dans le cas dune librairie dynamique, il faudra penser vrier que la variable denvironnement LD_LIBRARY_PATH permettra aux programmes de trouver la nouvelle librairie.