Vous êtes sur la page 1sur 18

CREATION ET UTILISATION D’UNE BIBLIOTHEQUE

Le présent document a été rédigé par les étudiants de 2ème année Ingé-
nieur de l’IAI, promotion 2016-2017, sous la supervision de Monsieur Pierre
MOUKELI MBINDZOUKOU, Enseignant.

Il est à usage exclusivement pédagogique. Toutes contributions


complémentaires et toutes améliorations sont les bienvenues et sont à adresser
à pierre.moukeli@gmail.com.

Table des matières


Table des matières ................................................................................................................................. 1
1. CREATION ET UTLISATION D’UNE BIBLIOTHEQUE .......................................................................... 3
1.1. Domaine d’application des bibliothèques .............................................................................. 3
1.2. Intérêt d’une bibliothèque ..................................................................................................... 4
1.3. Génération d’une bibliothèque .............................................................................................. 4
1.3.1. Les bibliothèques statiques ........................................................................................... 4
1.3.2. Les bibliothèques dynamiques ...................................................................................... 6
1.4. Principe général d’utilisation des bibliothèques ..................................................................... 8
2. ETUDE DE CAS ................................................................................................................................ 8
2.1. Besoins fonctionnels............................................................................................................... 8
2.2. Outils utilisés et solutions proposées ..................................................................................... 9
2.3. Description des scripts proposées .......................................................................................... 9
2.3.1. Contenu du fichier d’entêtes de fonctions (fonction_lib.h). ....................................... 10
2.3.2. Fichier .c contant le code source des fonctions déclarées dans le fichier .h. .............. 12
2.4. Exemple de Génération d’une bibliothèque ......................................................................... 15
2.4.1. Bibliothèques statiques ............................................................................................... 15
2.4.2. Bibliothèques dynamiques .......................................................................................... 16
2.4.3. Principe général d’utilisation des bibliothèques ......................................................... 18
3. CONCLUSION ................................................................................................................................ 18

1/17
Institut Africain d’Informatique (IAI) – Année académique 2016-2017 – Exposé de Système d’Exploitation – 2ème Ingénieur
2/17
Institut Africain d’Informatique (IAI) – Année académique 2016-2017 – Exposé de Système d’Exploitation – 2ème Ingénieur
Par définition, une bibliothèque est un ensemble de fonctions utilitaires, mises à
disposition sous forme de code binaire, pour être utilisées, en tant que code
exécutable, sans avoir à les réécrire et les recompiler. En d’autres termes, c’est une
collection de routines, qui peuvent être éditées ou prêtes à être utilisées par des
programmes.

La suite de ce document expose de manière synthétique, les techniques pour créer et


utiliser une bibliothèque. Cet exposé est illustré, en deuxième partie, par une étude de
cas dans laquelle un exemple complet est présenté.

1. CREATION ET UTLISATION D’UNE BIBLIOTHEQUE

1.1. Domaine d’application des bibliothèques

Les bibliothèques sont utilisées principalement pour mettre en œuvre des interfaces
de programmation, des frameworks et des plugins ; elles peuvent être incorporées
comme composantes des langages et environnements de programmation.

En tant qu’interface de programmation (en abrégé API pour Application Programming


Interface), une bibliothèque est un ensemble documenté et standardisé de routines
par lesquelles un logiciel offre des services à d'autres logiciels. Les routines mises à
disposition sont compilées et éditées (emballées) sous la forme d'une bibliothèque
logicielle appelée parfois package. L’éditeur de la bibliothèque propose souvent une
documentation spécifiant comment utiliser les routines.

Utilisées comme framework, une bibliothèque est une collection de classes (lots de
routines) qui, utilisées ensemble, forment le squelette d'un programme. Ils facilitent le
développement rapide d’applications (programmes).

Enfin, en tant que plugins, les bibliothèques sont des éléments de code exécutable
qu'une application recherche en vue d'étendre ses fonctionnalités. Cette technique est
utilisée par exemple par les navigateurs web pour prendre en charge l'affichage
d'animations ou de vidéos.

Programmer et exploiter des bibliothèques fait partie des utilisations ordinaires


des langages de programmation généralistes. Si dans les premiers langages de
programmation les fonctionnalités étaient délimitées par le lexique du langage, les
langages de programmation récents ont un lexique très réduit et beaucoup de

3/17
Institut Africain d’Informatique (IAI) – Année académique 2016-2017 – Exposé de Système d’Exploitation – 2ème Ingénieur
fonctionnalités sont apportées par des bibliothèques standards qui accompagnent le
langage de programmation. Par exemple la bibliothèque standard de C contient une
collection normalisée de routines permettant de manipuler des fichiers, d'écrire des
textes, d'utiliser la mémoire, ou de faire des calculs (c’est la bibliothèque stdio).

1.2. Intérêt d’une bibliothèque

Les principaux intérêts d’une bibliothèque sont notamment :


- La mutualisation du code objet ou exécutable : les routines écrites par une (ou
un groupe de) personne(s) sont réutilisables par d’autres ;
- La réduction de taille du code source, et dans une certaine mesure (e.g. plugins)
du code exécutable ;
- La réduction du nombre de fichiers d’un projet ;
- La facilité de mise à jour des programmes. En effet, lorsqu’une modification est
nécessaire, il suffit de la faire dans un seul fichier source, celui qui est concerné
dans la bibliothèque. Cette modification sera répercutée dans tous les pro-
grammes utilisant cette bibliothèque sous réserve de procéder à une nouvelle
édition de liens dans le cas d’une bibliothèque statique ;
- Un débogage plus précis. A force d’utilisation et du fait de leur conception par
des développeurs chevronnés, en principe les bibliothèques comportent des
routines (procédures et fonctions) bien rodées et testées. On peut donc les uti-
liser avec confiance et se focaliser uniquement sur le débogage du programme
principal ;
- Un temps de programmation réduit par le fait qu’on référence un code exécu-
table existant.

1.3. Génération d’une bibliothèque

Il existe deux types de bibliothèques : les bibliothèques statiques et les bibliothèques


dynamiques.

1.3.1. Les bibliothèques statiques

Une bibliothèque statique (généralement d’extension .a) est une bibliothèque qui sera
intégrée à l’exécutable (programme principal) lors de l’édition de lien. L’avantage de
cette stratégie est que l’exécutable, une fois édité, est autonome et ne nécessite rien
de plus pour être exécuté. La bibliothèque est en fait un fichier objet complémentaire.

Par convention, une bibliothèque statique est nommée : libname.a, où name est le
nom effectif de la bibliothèque. Exemple : libMath.a. La création d’une bibliothèque
statique se fait en plusieurs étapes.

4/17
Institut Africain d’Informatique (IAI) – Année académique 2016-2017 – Exposé de Système d’Exploitation – 2ème Ingénieur
1.3.1.1. Création d’un fichier objet pour une bibliothèque statique

La commande pour générer un fichier objet est la suivante :


gcc -c nomfichierSource.c -o nomfichierObjet.o

Exemples :
gcc –c toto.c –o toto.o
gcc –c tata.c –o tata.o
gcc –c titi.c –o titi.o

Options (arguments) de gcc :


 L’option -c : indique à gcc de ne pas activer l’éditeur de liens en vue de
générer programme exécutable. On obtiendra alors un fichier objet (.o).
En fait, après le compilateur C, la commande gcc activera l’assembleur
pour produire le programme objet, puis elle s’arrêtera ;

 L’option -o [fichier] : spécifie le fichier à produire au terme de l’exécution


de la commande gcc, qui peut être soit un fichier exécutable, soit un fi-
chier objet. Le fichier produit par défaut est a.out.

1.3.1.2. Création d’une bibliothèque statique

La commande à utiliser pour créer une bibliothèque à partir de fichiers objets existants
est ar (archiver en anglais) dont la syntaxe est :
ar –rcv libnom.a [liste des fichiers objet]

Exemple : Si toto, titi et tata sont des fichiers objet générés suivant les indi-
cations données en 3.1.1, alors pour les intégrer à la bibliothèque
statique personnage, on utilisera la commande ci-après :
ar –rcv libpersonnage.a toto.o titi.o tata.o

Options (arguments) de ar :
 L’option r : permet de remplacer les fichiers de l’archive par les nou-
veaux ;
 L’option c : permet de créer l’archive si elle n’existe pas encore ;
 L’option v : mode verbeux. Décrit (affiche) l’activité de la commande.

1.3.1.3. Génération de l’index pour une bibliothèque statique

Dans une bibliothèque statique, l’index est la liste des objets qui peuvent en être réfé-
rencés, exportés. C’est-à-dire les noms de variables et de fonctions (routines) existant
dans la bibliothèque, qui peuvent être utilisés par d’autres programmes.

5/17
Institut Africain d’Informatique (IAI) – Année académique 2016-2017 – Exposé de Système d’Exploitation – 2ème Ingénieur
La génération ou la mise à jour de l’index n’est pas obligatoire. Elle se fait grâce à la
commande :
ranlib [nom de la bibliothèque].

Exemple :
Ranlib libpersonnage.a

NB : Si la date de création ou de mise à jour de l’index est antérieure à la date (de la


dernière) modification de l’archive (bibliothèque statique), lorsqu’on essayera d’utili-
ser la bibliothèque, la commande gcc signalera une erreur. Pour résoudre ce problème,
on peut procéder de la façon suivante :

 Soit utiliser la commande ranlib pour mettre à jour (régénérer) l’index ;

 Soit lorsqu’on fait une copie de la bibliothèque, on utilise la commande cp avec


le tag (l’option) –p. Cela a le mérite de conserver tous les attributs de la biblio-
thèque y compris les droits d’accès, le propriétaire et la date de dernière mo-
dification.

1.3.2. Les bibliothèques dynamiques

Les bibliothèques dynamiques, .so (Sharing Object) sous Linux ou .dll (Dynamic Link
Library) sous Windows, sont des bibliothèques qui ne sont pas intégrées au code exé-
cutable lors de l’édition des liens. C’est au moment de l’exécution, que le programme
principal ou exécutable appellera alors la bibliothèque pour exécuter les fonctions
qu’elle contient. Il y a plusieurs avantages à cette stratégie par rapport aux biblio-
thèques statiques :
 la bibliothèque n’est chargée qu’une fois en mémoire même si elle est utilisée
(partagée) par plusieurs programmes ;
 L’exécutable (programme principal) est plus léger ;
 On peut mettre à jour la bibliothèque dynamique sans recompiler les pro-
grammes qui l’utilisent (à condition de ne pas modifier les fichiers d’entête ou
header .h).

Par convention une bibliothèque dynamique est généralement nommée libname.so.

1.3.2.1. Création de fichiers objet pour une bibliothèque dynamique

La commande est la même que pour la création des fichiers objet d’une bibliothèque
statique, sauf qu’ici, il faut obligatoirement utiliser l’option –fPIC (Position Indepen-
dent Code) pour générer le code exécutable sans indiquer d’adresse mémoire ; car en

6/17
Institut Africain d’Informatique (IAI) – Année académique 2016-2017 – Exposé de Système d’Exploitation – 2ème Ingénieur
fonction du programme qui utilisera cette bibliothèque, les adresses peuvent être dif-
férentes.

La commande pour créer une bibliothèque dynamique est :


gcc -c [nom fichier source] -fPIC -Wall –Wextra –o [nom fichier objet.o]

Exemples :
gcc –fPIC –Wall –Wextra –c toto.c –o toto.o
gcc –fPIC –Wall –Wextra –c tata.c –o tata.o
gcc –fPIC –Wall –Wextra –c titi.c –o titi.o

Arguments de la commande :
 L’option fPIC : Position Independent Code, pour générer le code exécu-
table sans indiquer d’adresse mémoire ;
 L’option Wall : permet de gérer les erreurs ;
 L’option Wextra : permet une meilleure gestion des variables externes.
Pour plus d’amples informations taper dans le terminal : man gcc.

1.3.2.2. Création d’une bibliothèque dynamique

Une bibliothèque dynamique est créée avec la commande suivante :


gcc -o libnom.so -shared [liste des fichiers objet .o]

Exemple :
gcc –o libpersonnage.so –shared toto.o titi.o tata.o

Argument de la commande :
 L’option shared : indique qu’il s’agit d’un code partagé ou code réen-
trant.

1.3.2.3. Modification de la variable d’environnement LD_LIBRARY_PATH

Lorsque l’on crée ou lance un programme exécutable, les librairies sont recherchées
dans des répertoires par défaut (/lib, /usr/lib, contrairement à Windows où la re-
cherche se fait dans le répertoire courant), et si elles n’y sont pas trouvées, la recherche
se poursuit dans la liste des répertoires spécifiés dans la variable d’environnement
LD_LIBRARY_PATH. En cas d’échec, la commande signale une erreur. Par conséquent,
à défaut de loger la bibliothèque dans les répertoires par défaut, il faut exporter (ajou-
ter) son chemin d’accès dans la variable d’environnement LD_LIBRARY_PATH à l’aide
de la commande export :
export LD_LIBRAIRY_PATH = $LD_LIBRAIRY_PATH : Chemin_Biblio

Exemple :
export LD_LIBRARY_PATH = $LD_LIBRARY_PATH : ~/chemin_Biblio/

7/17
Institut Africain d’Informatique (IAI) – Année académique 2016-2017 – Exposé de Système d’Exploitation – 2ème Ingénieur
N.B : Pour ne pas avoir à refaire cette manipulation à chaque démarrage du
système, il est préférable d’éditer le fichier ~/.profile (modifications n’affectant
que l’utilisateur courant) ou bien /etc/profile (modifications affectant tous les
utilisateurs de la machine, nécessitant donc d’être root pour les faire) et de
rajouter la ligne :
export LD_LIBRAIRY_PATH = $LD_LIBRAIRY_PATH : chemin_Biblio

1.4. Principe général d’utilisation des bibliothèques

Soit la bibliothèque libNOM_BIBLIO.a (ou libNOM_BIBLIO.so) se trouvant dans un ré-


pertoire dont le chemin absolu est CHEMIN ; pour compiler un fichier source faisant
appel à des fonctions de cette bibliothèque, il faut taper la ligne de commande sui-
vante :
gcc prog.c -LCHEMIN –lNOM_BIBLIO -o prog

Si la bibliothèque libNOM_BIBLIO est dynamique et que son chemin d’accès a été


spécifié dans la variable LD_LIBRARY_PATH, il n’est pas nécessaire de spécifier l’option
–L (cela est redondant).

L’éditeur de liens recherche premièrement une bibliothèque dynamique ayant le nom


qui lui a été fourni. Par conséquent, si dans le répertoire d’accès CHEMIN il existe deux
bibliothèques de même nom, l’une statique et l’autre dynamique, alors c’est la dyna-
mique qui sera utilisée pour la génération du programme exécutable. Si l’on veut dans
ce cas forcer gcc à utiliser la bibliothèque statique, il faudra lui spécifier les options « -
Wl, static » ou « -Bstatic ».

2. ETUDE DE CAS

Le projet qui nous a été posé dans le cadre de l’application du cours de Système
d’Exploitation est la mise en œuvre d’une bibliothèque, à savoir, un programme objet
(.o), susceptible d’être incorporer à d’autres programmes. Nous avons pris comme cas
d’illustration, le tri d’un fichier (.txt). L’analyse et la solution de ce problème sont
exposées dans le reste de cette partie.

2.1. Besoins fonctionnels

Pour la mise en œuvre de notre application, nous avons fait recours principalement à
quatre fonctions, à la suite de l’enchainement desquelles nous obtenons effectivement
trié :

8/17
Institut Africain d’Informatique (IAI) – Année académique 2016-2017 – Exposé de Système d’Exploitation – 2ème Ingénieur
- Une fonction pour lire les données à trier. Elle prendra pour paramètres le nom
et le chemin du fichier ;
- Une fonction pour faire le tri, laquelle prend en paramètres deux tableaux de
chaînes de caractères ;
- Une fonction dénommée qsort, qui est référencé par la précédente assurer le
tri effectif ;
- Une fonction qui prend en paramètres le nom, la taille et le chemin du fichier
permettant ainsi d’enregistrer le fichier trié.

2.2. Outils utilisés et solutions proposées

Nous avons utilisé un ordinateur comportant un système d’exploitation linux installé


en dual boot avec un système Windows, à savoir la version Linux Ubuntu, avec son
éditeur de texte g-édit.

Pour mener à bien notre projet, nous avons pensé à deux pistes de solutions :
- Accéder directement au fichier afin de le trier et d’afficher le résultat, avec
un inconvénient de lenteur de traitement ;
- Récupérer le contenu du fichier dans un tableau, effectuer le tri et restaurer
le résultat dans un autre fichier.

Nous avons opté pour la seconde option, que nous estimons la mieux adaptée à notre
cas d’un fichier volumineux.

2.3. Description des scripts proposées

La solution que nous avons choisie d’implémenter consiste à stocker le contenu du


fichier à trier dans un tableau de chaines de caractères, puis à le trier et stocker ce dernier
dans un nouveau fichier.

A cet effet, nous aurons besoin de trois (3) procédures principales : une pour charger le
contenu d’un fichier dans un tableau, une autre pour trier le tableau et une dernière pour
stocker le tableau trié dans un nouveau fichier. Ces procédures peuvent utiliser d’autres
fonctions et procédures et fonctions pour effectuer leurs traitements respectifs.

Le code source de ces différentes fonctions et procédures est décliné ci-après.

9/17
Institut Africain d’Informatique (IAI) – Année académique 2016-2017 – Exposé de Système d’Exploitation – 2ème Ingénieur
2.3.1. Contenu du fichier d’entêtes de fonctions (fonction_lib.h).

La fonction infoFichier() collecte et enregistre dans des variables globales, un certain


nombre d’informations sur un fichier telles que le nombre de lignes du fichier, le nombre
de caractères de la ligne la plus longue du fichier, le nombre de mots contenus dans le
fichier, etc. Ces variables sont les suivantes :
 int* nbreCaracMax : le nombre de caractères de la ligne la plus longue ;
 int* longueurMaxMot : le nombre de caractères du mot le plus long ;
 int* nbreMots : le nombre de mots contenus dans le fichier ;
 int* nbreLignes : le nombre de lignes du fichier ;
 FILE* fichierATrie : le fichier à traiter.

La fonction allocation() permet de créer un tableau dynamique, et prend comme


paramètres, le nombre de lignes (nbl) et le nombre de colonnes du tableau (nbc).

La procédure loadFichier() sert à récupérer le contenu d’un fichier et à le stocker en


mémoire dans un tableau de chaînes de caractères. Elle prend pour paramètres :
 FILE* fichierATrie : nom du fichier à trier ;
 char** tab : tableau de chaines de caractère dans lequel le contenu du fichier
sera stocké ;
 intnbreCaracMax : nombre de caractères du mot le plus long ;
 intnbreLigne : nombre de lignes du fichier.

La procédure saveArray() récupère le contenu de chaque case d’un tableau de chaines


de caractères qu’elle stocke dans un fichier. Cette procédure prend également trois (3)
paramètres, à savoir :
 FILE* fichierTrie : nom du fichier dans lequel seras stocké le tableau trié ;
 char** tabChaine : tableau dont le contenu sera enregistré dans un fichier ;
 inttailleTab : la taille du tableau.

La fonction libération() permet de libérer la mémoire occupée par un tableau dynamique


de nbl lignes et nbc colonnes, une fois que l’on n’a plus besoin de ce tableau. Ses para-
mètres sont définis de la façon suivante :
 char** tabChar : tableau concerné ;

10/17
Institut Africain d’Informatique (IAI) – Année académique 2016-2017 – Exposé de Système d’Exploitation – 2ème Ingénieur
 int nbl : nombre de lignes ;
 int nbc : nombre de colonnes.

La fonction compare_asc() sert à comparer deux chaines de caractères. Cette fonction


sera utilisée par la fonction qsort pour effectuer le tri croissant d’un tableau de chaines
de caractères. Pour effectuer ce tri, la fonction compare_desc sera utilisée. Celle-ci est
définie comme suit :

La fonction compare_desc() sert à comparer deux chaines de caractères. Cette fonction


sera utilisée par la fonction qsort pour effectuer le tri décroissant d’un tableau de chaines
de caractères.

La fonction triFichier() est la fonction principale de la bibliothèque que nous souhaitons


réaliser. Elle utilise les fonctions définies plus haut afin de trier un fichier. Ses trois
paramètres sont :
 FILE* fich1 : représente le fichier à trier.
 FILE* fich2 : C’est le fichier trié.
 int asc : permet d’indiquer le type de tri que l’on désire effectuer : l’on mettra
pour ce paramètre la valeur 1 pour un tri croissant et une valeur différente de 1
pour un tri décroissant.

11/17
Institut Africain d’Informatique (IAI) – Année académique 2016-2017 – Exposé de Système d’Exploitation – 2ème Ingénieur
2.3.2. Fichier .c contant le code source des fonctions déclarées dans le fichier .h.

a) Code de la procédure infoFichier :

b) Code de la fonction allocation

12/17
Institut Africain d’Informatique (IAI) – Année académique 2016-2017 – Exposé de Système d’Exploitation – 2ème Ingénieur
c) Code de la procédure loadFichier

d) Code de la procédure saveArray

e) Code de procédure liberation

f) Code de la procédure compare_asc

g) Code de la procédure compare_desc

13/17
Institut Africain d’Informatique (IAI) – Année académique 2016-2017 – Exposé de Système d’Exploitation – 2ème Ingénieur
h) Code de la procédure triFichier

Observations : Dans l’implémentation de la procédure de tri du fichier, nous constatons


que les trois étapes citées plus haut pour la résolution du problème apparaissent bel et
bien. Aussi pouvons-nous constater toujours dans cette procédure, l’utilisation de la
fonction qsort. Cette fonction implémente un algorithme de tri non spécifié qui permet
de trier tout ou partie de n’importe quel tableau de données. Elle s’appuie sur une fonc-
tion utilisateur (compare_asc ou compare_desc dans notre cas) qui se charge d’exprimer
le critère de tri. La fonction qsort est générique ; c’est-à-dire qu’elle s’applique à tout,
que ce soit un tableau d’entiers simples (int) ou de double, ou encore de structure, etc.
Afin de pouvoir faire le tri, elle a besoin de quatre (4) paramètres :
 L’adresse de début du tableau ;
 Le nombre d’éléments du tableau ;
 La taille de chaque élément ;
 Une fonction pour comparer deux éléments du tableau.

Avec ces paramètres, qsort va appliquer un algorithme classique de tri qui comparera
les éléments à l’aide de la fonction dont l’adresse est passée en paramètre ; ensuite elle
permutera au besoin en échangeant le contenu des deux blocs mémoire.

N.B : Si vous voulez qu’une routine ne soit pas accessible hors de votre bibliothèque, il
faudra la déclarer static.

14/17
Institut Africain d’Informatique (IAI) – Année académique 2016-2017 – Exposé de Système d’Exploitation – 2ème Ingénieur
2.4. Exemple de Génération d’une bibliothèque
***** modifier cette partie pour montrer comment l’exemple précédent pour être com-
pilé et géré comme une bibliothèque****

Il existe deux types de bibliothèques : les bibliothèques statiques et les bibliothèques


dynamiques.

2.4.1. Bibliothèques statiques

Une bibliothèque statique (généralement d’extension .a) est une bibliothèque qui sera
intégrée à l’exécutable lors de l’édition de lien. L’avantage de cette stratégie est que
l’exécutable est autonome et ne nécessite rien de plus pour fonctionner. La biblio-
thèque se comporte comme un fichier objet complémentaire. Par convention, une bi-
bliothèque statique est nommée: libname.a, où name est le nom effectif de la biblio-
thèque. Exemple : libMath.a. La création d’une bibliothèque statique se fait en plu-
sieurs étapes.

2.4.1.1. Création d’un fichier objet pour une bibliothèque statique.

La commande pour générer un fichier objet est :


gcc -c nomfichierSource.c -o nomfichierObjet.o

Exemples :
gcc –c toto.c –o toto.o
gcc –c tata.c –o tata.o
gcc –c titi.c –o titi.o

Arguments de gcc :
 L’option -c : indique à gcc de ne pas activer l’éditeur de liens en vue de
générer programme exécutable. On obtiendra alors un fichier objet (.o).
En fait, après le compilateur c, la commande gcc activera l’assembleur
pour produire le programme objet, puis elle s’arrêtera ;
 L’option -o [fichier] : spécifie le fichier à produire au terme de l’exécution
de la commande gcc, qui peut être soit un fichier exécutable, soit un fi-
chier objet. Le fichier produit par défaut est a.out.

2.4.1.2. Création d’une bibliothèque statique.

La commande à utiliser pour créer une bibliothèque à partir de fichiers objets existants
est ar (archiver en anglais) dont la syntaxe est :
ar –rcv libnom.a [liste des fichiers objet]

Exemple :
15/17
Institut Africain d’Informatique (IAI) – Année académique 2016-2017 – Exposé de Système d’Exploitation – 2ème Ingénieur
ar –rcv libpersonnage.a toto.o titi.o tata.o

Arguments :
 L’option r : permet de remplacer les fichiers de l’archive par les nou-
veaux ;
 L’option c : permet de créer l’archive si elle n’existe pas encore ;
 L’option v : mode verbeux. Décrit (affiche) l’activité de la commande.

2.4.1.3. Génération de l’index pour une bibliothèque statique

La génération ou la mise à jour de l’index n’est pas obligatoire. Elle se fait grâce à la
commande :
ranlib [nom de la bibliothèque].

Exemple :
Ranlib libpersonnage.a

NB : Si la date de création ou de mise à jour de l’index est antérieure à la date (de la


dernière) modification de l’archive (bibliothèque statique), lorsqu’on essayera d’utili-
ser la bibliothèque, la commande gcc signalera une erreur. Pour résoudre ce problème,
on peut procéder de la façon suivante :

 Soit utiliser la commande ranlib pour mettre à jour (régénérer) l’index ;

 Soit lorsqu’on fait une copie de la bibliothèque, on utilise la commande cp avec


le tag (l’option) –p. Cela a le mérite de conserver tous les attributs de la biblio-
thèque y compris les droits d’accès, le propriétaire et la date de dernière mo-
dification.

2.4.2. Bibliothèques dynamiques

Les bibliothèques dynamiques - .so (Sharing Object) sous Linux ou .dll (Dynamic Link
Library) sous Windows – sont des bibliothèques qui ne sont pas intégrées à l’exécutable
lors de l’édition des liens. Au moment de l’exécution, le programme principal ou exé-
cutable appellera alors la bibliothèque pour exécuter les fonctions qu’elle contient. Il y
a plusieurs avantages à cette stratégie par rapport aux bibliothèques statiques :
 la bibliothèque n’est chargée qu’une fois en mémoire même si elle est utilisée
(partagée) par plusieurs programmes ;
 L’exécutable (programme principal) est plus léger ;

16/17
Institut Africain d’Informatique (IAI) – Année académique 2016-2017 – Exposé de Système d’Exploitation – 2ème Ingénieur
 On peut mettre à jour la bibliothèque dynamique sans recompiler les pro-
grammes qui l’utilisent (à condition de ne pas modifier les fichiers d’entête ou
header .h).

Par convention une bibliothèque dynamique est généralement nommée libname.so.

2.4.2.1. Création de fichiers objet pour une bibliothèque dynamique

La commande est la même que pour la création des fichiers objet d’une bibliothèque
statique, sauf qu’ici, il faut obligatoirement utiliser l’option –fPIC (Position Indepen-
dent Code) pour générer le code exécutable sans indiquer d’adresse mémoire ; car en
fonction du programme qui utilisera cette bibliothèque, les adresses peuvent être dif-
férentes. La commande pour créer une bibliothèque dynamique est :
gcc -c [nom fichier source] -fPIC -Wall –Wextra –o [nom fichier objet.o]

Exemples :
gcc –fPIC –Wall –Wextra –c toto.c –o toto.o
gcc –fPIC –Wall –Wextra –c tata.c –o tata.o
gcc –fPIC –Wall –Wextra –c titi.c –o titi.o

Arguments de la commande :
 L’option fPIC : Position Independent Code) pour générer le code exécu-
table sans indiquer d’adresse mémoire ;
 L’option Wall : permet gérer les erreurs
 L’option Wextra : permet une meilleure gestion des variables externes.
Pour plus d’amples informations taper dans le terminal : man gcc.

2.4.2.2. Création d’une bibliothèque dynamique

Une bibliothèque dynamique est créée avec la commande suivante :


gcc -o libnom.so -shared [liste des fichiers objet .o]

Exemple :
gcc –o libpersonnage.so –shared toto.o titi.o tata.o

Argument de la commande :
 L’option shared : indique qu’il s’agit d’un code partagé ou code réen-
trant.

2.4.2.3. Modification de la variable d’environnement LD_LIBRARY_PATH

Lorsque l’on crée ou lance un programme exécutable, les librairies sont recherchées
dans des répertoires par défaut (/lib, /usr/lib, contrairement à Windows où la re-
cherche se fait dans le répertoire courant), et si elles n’y sont pas trouvées, la recherche
17/17
Institut Africain d’Informatique (IAI) – Année académique 2016-2017 – Exposé de Système d’Exploitation – 2ème Ingénieur
se poursuit dans la liste des répertoires spécifiés dans la variable d’environnement
LD_LIBRARY_PATH. En cas d’échec, la commande signale une erreur. Par conséquent,
à défaut de loger la bibliothèque dans les répertoires par défaut, il faut exporter (ajou-
ter) son chemin d’accès dans la variable d’environnement LD_LIBRARY_PATH à l’aide
de la commande export :
export LD_LIBRAIRY_PATH = $LD_LIBRAIRY_PATH : Chemin_Biblio

Exemple :
export LD_LIBRARY_PATH = $LD_LIBRARY_PATH : ~/chemin_Biblio/

N.B : Pour ne pas avoir à refaire cette manipulation à chaque démarrage du


système, il est préférable d’éditer le fichier ~/.profile (modifications n’affectant
que l’utilisateur courant) ou bien /etc/profile (modifications affectant tous les
utilisateurs de la machine, nécessitant donc d’être root pour les faire) et de
rajouter la ligne :
export LD_LIBRAIRY_PATH = $LD_LIBRAIRY_PATH : chemin_Biblio

2.4.3. Principe général d’utilisation des bibliothèques

Soit la bibliothèque libNOM_BIBLIO.a (ou libNOM_BIBLIO.so) se trouvant dans un ré-


pertoire dont le chemin absolu est CHEMIN ; pour compiler un fichier source faisant
appel à des fonctions de cette bibliothèque, il faut taper la ligne de commande sui-
vante :
gcc prog.c -LCHEMIN –lNOM_BIBLIO -o prog

Si la bibliothèque libNOM_BIBLIO est dynamique et que son chemin d’accès a été


spécifié dans la variable LD_LIBRARY_PATH, il n’est pas nécessaire de spécifier l’option
–L (cela est redondant).

L’éditeur de liens recherche premièrement une bibliothèque dynamique ayant le nom


qui lui a été fourni. Par conséquent, si dans le répertoire d’accès CHEMIN il y existe
deux bibliothèques de même nom, l’une statique et l’autre dynamique, alors c’est la
dynamique qui sera utilisée pour la génération du programme exécutable. Si l’on veut
dans ce cas forcer gcc à utiliser la bibliothèque statique, il faudra lui spécifier les op-
tions « -Wl, static » ou « -Bstatic ».

3. CONCLUSION
Les bibliothèques représentent ce qu’est le tracteur au cultivateur puisqu’elles permettent
aux développeurs de produire rapidement et efficacement des applications. Pour notre part,
ce travail nous a permis de nous familiariser avec les mécanismes de création, de gestion et
d’utilisation des bibliothèques. C’était aussi l’occasion de mieux découvrir l’environnement
Linux et la programmation en langage C.

18/17
Institut Africain d’Informatique (IAI) – Année académique 2016-2017 – Exposé de Système d’Exploitation – 2ème Ingénieur

Vous aimerez peut-être aussi