Vous êtes sur la page 1sur 13

Ministère de l’Enseignement Supérieur, de la Recherche Scientifique et de la Technologie

Université Virtuelle de Tunis

Outils de Base pour le


Développement sous Linux

Leçon3 : Edition des liens et création des


bibliothèques

Concepteur : Walid Barhoumi

Attention !
Ce produit pédagogique numérisé est la propriété exclusive de l'UVT. Il est
strictement interdit de le reproduire à des fins commerciales. Seul le
téléchargement ou impression pour un usage personnel
(1 copie par utilisateur) est permis.
Université Virtuelle de Tunis Outils de Base pour le Développement sous Linux
Edition des liens et création des bibliothèques

Leçon 3 : Edition des liens et création des


bibliothèques

Objectifs de la leçon 3 « édition de liens et création des bibliothèques »

- Discriminer entre les bibliothèques et les fichiers « .h ».


- Identifier le rôle de l’éditeur des liens et les différents types
d’édition des liens.
- Distinguer entre les bibliothèques d’archive et les bibliothèques
partagées.
- Générer des bibliothèques d’archive.
- Générer des bibliothèques partagées.

Plan de la leçon 3 « édition de liens et création des bibliothèques »

o 3.1 Introduction
o 3.2 Types d’édition des liens
o 3.3 Exemple de création d’une bibliothèque statique et
d’édition de liens statique
o 3.4 Exemple de création d’une bibliothèque partagée et
d’édition de liens dynamique
o 3.5 Quelques commandes utiles pour la gestion des
bibliothèques

2 Walid Barhoumi
Université Virtuelle de Tunis Outils de Base pour le Développement sous Linux
Edition des liens et création des bibliothèques

3.1 Introduction :

La dernière étape dans toute procédure de compilation d’un programme est l’édition de liens,
dont le rôle est la production d’un exécutable à partir d’un ou de plusieurs fichiers objets et
éventuellement des fichiers de bibliothèques. Elle vise à lier tous les fichiers objets du
programme, qui sont déjà générés lors des étapes précédentes de la compilation, tout en
résolvant toutes les références entre les différents modules du code source du programme (tels
que les appels des fonctions qui ne sont pas spécifiques au programme en cours ou les
références à des variables définies dans d’autres modules à l’aide de la table des symboles).
Notons qu’il ne faut pas confondre les bibliothèques, qui contiennent les codes des fonctions,
avec les fichiers « .h » (qu’on inclut souvent au début d’un programme C), qui contiennent
plutôt les prototypes des fonctions.

Par ailleurs, il faut indiquer, lors de la compilation d’un programme, les bibliothèques non-
standards utilisées par ce programme. Dans tous les exemples que nous avons vus dans les
leçons précédentes, nous n’avons pas eu besoin de le faire puisque nous n’avons utilisé que la
bibliothèque standard « libc » (qui contient les fonctions « printf », « scanf », « atoi »,
« strlen »…). Cependant, pour lier, par exemple, avec la bibliothèque « pthread » de gestion
des processus légers (threads), il est indispensable de compiler le code source (par exemple
« prog.c ») comme suit :

gcc -lpthread prog.c

3.2 Types d’édition des liens :

En langage C, il existe deux types d’édition de liens. D’un coté, l’édition de liens statique
permet de générer les bibliothèques d’archive (avec l’extension « .a » pour « archive »). De
l’autre coté, l’édition de liens dynamique permet de générer les bibliothèques partagées (avec
l’extension « .so » pour « shared object »). En effet, il est possible de compiler un fichier
source de bibliothèque, comportant plusieurs fonctions mais ne comportant pas de fonction
« main » (c.f. Leçon 2), selon trois niveaux distincts :

3 Walid Barhoumi
Université Virtuelle de Tunis Outils de Base pour le Développement sous Linux
Edition des liens et création des bibliothèques

- En un fichier objet (avec l’extension « .o ») via la commande « gcc –c ».

- En un fichier de bibliothèque statique (avec l’extension « .a »). En effet, une


bibliothèque statique est par convention intitulée « libnom_archive.a ». Dans ce
cas, l’édition de liens statique revient à lier l’ensemble des fichiers « .o » avec
l’archiveur « ar ». Le résultat est un gros fichier exécutable qui est indépendant des
bibliothèques installées sur le système.

- En un fichier de bibliothèque dynamique (avec l’extension « .so »). En effet, une


bibliothèque dynamique est par convention intitulée « libnom_archive.so ». Dans
ce cas, l’édition de liens dynamique revient à lier l’ensemble des fichiers « .o »
tout en mettant à jour la variable d’environnement Shell
« LD_LIBRARY_PATH ». Le résultat est un fichier exécutable de taille réduite
par rapport à celui résultant d’une édition de liens statique. En effet, les
bibliothèques partagées ne sont chargées que lorsqu’un programme les appelle, ce
qui permet de gagner de la place en mémoire centrale.

Dans ce qui suit, nous verrons comment un programme principal en langage C (qui comporte
la fonction « main ») fait appel aux différentes fonctions d’une bibliothèque d’archive ou
d’une bibliothèque partagée.

3.3 Exemple de création d’une bibliothèque statique et d’édition de liens


statique :

Soit les deux programmes « fonctions.c » et « affichage.c » suivants qui contiennent des
fonctions sans contenir la fonction principale « main ».

4 Walid Barhoumi
Université Virtuelle de Tunis Outils de Base pour le Développement sous Linux
Edition des liens et création des bibliothèques

Figure 3.1 Capture d’écran du fichier « fonctions.c ».

Figure 3.2 Capture d’écran du fichier « affichage.c ».

La première étape consiste à créer les fichiers objets relatives aux deux fichiers sources de
bibliothèque « fonctions.c » et « affichage.c », comme suit :

gcc -c fonctions.c -o fonctions.o

gcc -c affichage.c -o affichage.o

5 Walid Barhoumi
Université Virtuelle de Tunis Outils de Base pour le Développement sous Linux
Edition des liens et création des bibliothèques

La deuxième étape consiste à créer la bibliothèque statique et ceci en convertissant les fichiers
objets « fonctions.o » et « affichage.o » en une bibliothèque statique, intitulée « libmp2l.a »
dans notre exemple, comme suit :

ar r libmp2l.a fonctions.o affichage.o

En effet, la commande « ar » avec l’option « r » permet d’ajouter les deux fichiers dans la
bibliothèque, alors que l’option « t » permet d’afficher le contenu d’une bibliothèque archive
(utiliser « man ar » pour plus d’informations sur les options de cette commande). Notons que
la commande « file » affiche le type d’un fichier sous Unix.

6 Walid Barhoumi
Université Virtuelle de Tunis Outils de Base pour le Développement sous Linux
Edition des liens et création des bibliothèques

Ainsi, une bibliothèque archive « libmp2l.a », qui contient un ou plusieurs fichiers objets et
qui débute par un index, est créé, dont la table des symboles peut être affichée par la
commande :

objdump –t libmp2l.a

Il est possible de consulter l’index d’une bibliothèque archive en utilisant la commande


« nm ». En retour, la lettre « U » indique que le symbole n’est pas défini dans l’archive, et la
lettre « T » indique que le symbole est dans l’archive. Par exemple, « puts » apparaît ici comme
« U » vu qu’il est utilisé mais appartient à une autre archive.

7 Walid Barhoumi
Université Virtuelle de Tunis Outils de Base pour le Développement sous Linux
Edition des liens et création des bibliothèques

Maintenant, on peut utiliser la bibliothèque statique « libmp2l.a » pour compiler des


programmes en langage C. Par exemple, pour compiler un programme « biblio_partagee.c »
tout en faisant appel aux fonctions de la bibliothèque statique « libmp2l.a », il suffit de passer
en paramètre à la commande « gcc » le nom du fichier de la bibliothèque statique, comme
suit :

gcc biblio_partagee.c libmp2l.a -o bibexec

On obtient ainsi un fichier « bibexec » exécutable, dont on peut afficher la taille via la
commande « wc –c bibexec » ou la commande « ls –l bibexec ».

8 Walid Barhoumi
Université Virtuelle de Tunis Outils de Base pour le Développement sous Linux
Edition des liens et création des bibliothèques

Figure 3.3 Capture d’écran du fichier « biblio_partagee.c ».

3.4 Exemple de création d’une bibliothèque partagée et d’édition de liens


dynamique :

Prenons les mêmes programmes « fonctions.c » et « affichage.c » pour les quels nous avons
déjà créé les fichiers objets correspondants « fonctions.o » et « affichage.o ». L’étape
suivante consiste à créer la bibliothèque partagée et ceci en convertissant les fichiers objets
« fonctions.o » et « affichage.o » en une bibliothèque partagée, intitulée « libmp2l.so » dans
notre exemple, comme suit :

gcc –o libmp2l.so fonctions.o affichage.o

9 Walid Barhoumi
Université Virtuelle de Tunis Outils de Base pour le Développement sous Linux
Edition des liens et création des bibliothèques

Ainsi, une bibliothèque partagée « libmp2l.so » est créé, dont la table des symboles peut être
affichée par la commande « objdump ». Il est aussi possible de consulter l’index d’une
bibliothèque partagée en utilisant la commande « nm ».

10 Walid Barhoumi
Université Virtuelle de Tunis Outils de Base pour le Développement sous Linux
Edition des liens et création des bibliothèques

Une fois la bibliothèque partagée est créée, l’éditeur de liens dynamiques « ld » recherchera
les bibliothèques dans les répertoires spécifiés dans le fichier « /etc/ld.so.conf » (notamment
les répertoires « /lib », « /usr/lib ») et dans la variable d’environnement
« LD_LIBRARY_PATH ». Pour cela, il est indispensable de mettre à jour la liste des
chemins pour trouver les bibliothèques partagées. Pour ce faire, on peut :

- Soit mettre à jour la variable « LD_LIBRARY_PATH » en y ajoutant le


répertoire qui contient la bibliothèque partagée.
- Soit en copiant la bibliothèque partagée dans l’un des les répertoires spécifiés
dans le fichier « /etc/ld.so.conf ».

11 Walid Barhoumi
Université Virtuelle de Tunis Outils de Base pour le Développement sous Linux
Edition des liens et création des bibliothèques

Dans notre cas, nous avons copié la bibliothèque partagée « libmp2l.so » dans le répertoire
« /usr/lib ». Cependant, on aurait pu rajouter le répertoire courant au chemin de recherche des
bibliothèques partagées via la commande « export LD_LIBRARY_PATH=`pwd` ».

Ainsi, on peut maintenant utiliser la bibliothèque partagée « libmp2l.so » pour compiler des
programmes en langage C. Par exemple, pour compiler le programme « biblio_partagee.c »
tout en faisant appel aux fonctions de la bibliothèque partagée « libmp2l.so », il suffit de
passer en paramètre à la commande « gcc », le nom du fichier de la bibliothèque partagée,
comme suit :

gcc biblio_partagee.c -lmp2l -o bibexec2

Notons qu’il faut indiquer à la commande « gcc », via la lettre « l », quelle bibliothèque
dynamique l’éditeur de lien « ld » doit-il utiliser. On peut utiliser aussi l’option « -L » afin de
spécifier le chemin du répertoire qui contient la bibliothèque dynamique à utiliser.

On obtient ainsi un fichier « bibexec2 » exécutable, dont on peut afficher la taille via la
commande « wc –c bibexec2 » ou la commande « ls –l bibexec2 ».

12 Walid Barhoumi
Université Virtuelle de Tunis Outils de Base pour le Développement sous Linux
Edition des liens et création des bibliothèques

Il est clair que l’exécutable « bibexec2 » est de taille réduite par rapport à celui (« bibexec2 »)
résultant d’une édition de liens statique pour les mêmes programmes. En effet, si plusieurs
exécutables qui utilisent les mêmes fonctions de bibliothèques partagées sont lancés en même
temps, le code des fonctions est présent une seule fois dans la mémoire. Toutefois, la
bibliothèque partagée doit être présente sur l’ordinateur où sera assurée l’exécution, ce qui
pose des problèmes de portabilité des ces exécutables.

3.6 Quelques commandes utiles pour la gestion des bibliothèques :

- La commande « ldd prog.c » permet de savoir les bibliothèques partagées


utilisées par le programme « prog.c ».
- La commande « ldvonfig –v » permet d’afficher les bibliothèques installées sur
le système. Par exemple, pour vérifier s’il existe sur le système une fonction de
décodage d’un fichier « mp3 », il suffit d’utiliser la commande « ldvonfig –v |
grep mp3 », qui permet de vérifier s’il en existe une bibliothèque de gestion
des fichiers « mp3 ». Si la bibliothèque est installée sur le système, on utilise la
commande « whereis » pour localiser le fichier recherché.
- Les fichiers d’aides (.doc) des différentes bibliothèques installées dans le
système se trouvent dans le répertoire « /usr/share/doc ».
13 Walid Barhoumi

Vous aimerez peut-être aussi