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