Rechercher

2.4. Créer des bibliothèques avec GCC

download PDF

Ce chapitre décrit les étapes de création des bibliothèques et explique les concepts nécessaires utilisés par le système d'exploitation Linux pour les bibliothèques.

2.4.1. Conventions de dénomination des bibliothèques

Une convention spéciale sur les noms de fichiers est utilisée pour les bibliothèques : une bibliothèque connue sous le nom de foo est censée exister sous la forme d'un fichier libfoo.so ou libfoo.a. Cette convention est automatiquement comprise par les options d'entrée de GCC, mais pas par les options de sortie :

  • Lors de l'établissement d'un lien avec la bibliothèque, celle-ci ne peut être spécifiée que par son nom foo avec l'option -l, comme suit -lfoo:

    $ gcc ... -lfoo...
  • Lors de la création de la bibliothèque, le nom complet du fichier libfoo.so ou libfoo.a doit être spécifié.

2.4.2. Le mécanisme du soname

Les bibliothèques chargées dynamiquement (objets partagés) utilisent un mécanisme appelé soname pour gérer plusieurs versions compatibles d'une bibliothèque.

Conditions préalables

  • Vous devez comprendre la liaison dynamique et les bibliothèques.
  • Vous devez comprendre le concept de compatibilité ABI.
  • Vous devez comprendre les conventions de dénomination des bibliothèques.
  • Vous devez comprendre les liens symboliques.

Introduction du problème

Une bibliothèque chargée dynamiquement (objet partagé) existe en tant que fichier exécutable indépendant. Cela permet de mettre à jour la bibliothèque sans mettre à jour les applications qui en dépendent. Ce concept pose toutefois les problèmes suivants :

  • Identification de la version actuelle de la bibliothèque
  • Nécessité de disposer de plusieurs versions de la même bibliothèque
  • Signalisation de la compatibilité ABI de chacune des multiples versions

Le mécanisme du soname

Pour résoudre ce problème, Linux utilise un mécanisme appelé soname.

La version de la bibliothèque foo X.Y est ABI-compatible avec les autres versions dont le numéro de version contient la même valeur que X. Les modifications mineures préservant la compatibilité augmentent le numéro Y. Les modifications majeures qui rompent la compatibilité augmentent le numéro X.

La version actuelle de la bibliothèque foo X.Y existe sous la forme d'un fichier libfoo.so.x.y. Dans le fichier de la bibliothèque, un nom de son est enregistré avec la valeur libfoo.so.x pour signaler la compatibilité.

Lorsque les applications sont construites, l'éditeur de liens recherche la bibliothèque dans le fichier libfoo.so. Un lien symbolique portant ce nom doit exister et pointer vers le fichier de la bibliothèque. L'éditeur de liens lit ensuite le nom de son du fichier de la bibliothèque et l'enregistre dans le fichier exécutable de l'application. Enfin, l'éditeur de liens crée l'application qui déclare dépendre de la bibliothèque en utilisant le nom de son, et non un nom ou un nom de fichier.

Lorsque l'éditeur de liens dynamiques d'exécution lie une application avant de l'exécuter, il lit le soname dans le fichier exécutable de l'application. Ce nom de son est libfoo.so.x. Un lien symbolique portant ce nom doit exister et pointer vers le fichier de la bibliothèque. Cela permet de charger la bibliothèque, quel que soit le composant Y d'une version, car le nom de son ne change pas.

Note

La composante Y du numéro de version n'est pas limitée à un seul chiffre. En outre, certaines bibliothèques codent leur version dans leur nom.

Lecture du nom de famille à partir d'un fichier

Pour afficher le nom de son d'un fichier de bibliothèque somelibrary:

$ objdump -p somelibrary | grep SONAME

Remplacez somelibrary par le nom du fichier de la bibliothèque que vous souhaitez examiner.

2.4.3. Créer des bibliothèques dynamiques avec GCC

Les bibliothèques liées dynamiquement (objets partagés) permettent :

  • conservation des ressources par la réutilisation des codes
  • une sécurité accrue en facilitant la mise à jour du code de la bibliothèque

Suivez les étapes suivantes pour créer et installer une bibliothèque dynamique à partir des sources.

Conditions préalables

  • Vous devez comprendre le mécanisme du soname.
  • GCC doit être installé sur le système.
  • Vous devez disposer du code source d'une bibliothèque.

Procédure

  1. Se rendre dans le répertoire contenant les sources de la bibliothèque.
  2. Compilez chaque fichier source en un fichier objet avec l'option de code indépendant de la position -fPIC:

    $ gcc ... -c -fPIC some_file.c...

    Les fichiers objets portent le même nom que les fichiers du code source original, mais leur extension est .o.

  3. Lier la bibliothèque partagée à partir des fichiers objets :

    $ gcc -shared -o libfoo.so.x.y -Wl,-soname,libfoo.so.x some_file.o ...

    Le numéro de version majeure utilisé est X et le numéro de version mineure Y.

  4. Copier le fichier libfoo.so.x.y à un emplacement approprié, où l'éditeur de liens dynamiques du système peut le trouver. Sur Red Hat Enterprise Linux, le répertoire des bibliothèques est /usr/lib64:

    # cp libfoo.so.x.y /usr/lib64

    Notez que vous devez disposer des droits de root pour manipuler les fichiers de ce répertoire.

  5. Créer la structure de lien symbolique pour le mécanisme de soname :

    # ln -s libfoo.so.x.y libfoo.so.x
    # ln -s libfoo.so.x libfoo.so

Ressources supplémentaires

2.4.4. Créer des bibliothèques statiques avec GCC et ar

La création de bibliothèques pour l'établissement de liens statiques est possible grâce à la conversion des fichiers objets en un type spécial de fichier d'archive.

Note

Red Hat décourage l'utilisation de la liaison statique pour des raisons de sécurité. N'utilisez l'édition de liens statiques qu'en cas de nécessité, en particulier pour les bibliothèques fournies par Red Hat. Consultez Section 2.3.2, « Liaison statique et dynamique » pour plus de détails.

Conditions préalables

  • GCC et binutils doivent être installés sur le système.
  • Vous devez comprendre ce que sont les liens statiques et dynamiques.
  • Le(s) fichier(s) source(s) contenant des fonctions à partager en tant que bibliothèque est (sont) disponible(s).

Procédure

  1. Créer des fichiers objets intermédiaires avec GCC.

    $ gcc -c source_file.c...

    Ajoutez d'autres fichiers sources si nécessaire. Les fichiers objets résultants partagent le même nom de fichier mais utilisent l'extension de nom de fichier .o.

  2. Transformez les fichiers objets en une bibliothèque statique (archive) à l'aide de l'outil ar du paquet binutils.

    $ ar rcs libfoo.a source_file.o...

    Le fichier libfoo.a est créé.

  3. Utilisez la commande nm pour inspecter l'archive résultante :

    $ nm libfoo.a
  4. Copiez le fichier de la bibliothèque statique dans le répertoire approprié.
  5. Lors de l'édition de liens avec la bibliothèque, GCC reconnaît automatiquement, à partir de l'extension du nom de fichier .a, que la bibliothèque est une archive pour l'édition de liens statiques.

    $ gcc ... -lfoo...

Ressources supplémentaires

  • Page de manuel Linux pour ar(1):

    $ man ar
Red Hat logoGithubRedditYoutubeTwitter

Apprendre

Essayez, achetez et vendez

Communautés

À propos de la documentation Red Hat

Nous aidons les utilisateurs de Red Hat à innover et à atteindre leurs objectifs grâce à nos produits et services avec un contenu auquel ils peuvent faire confiance.

Rendre l’open source plus inclusif

Red Hat s'engage à remplacer le langage problématique dans notre code, notre documentation et nos propriétés Web. Pour plus de détails, consultez leBlog Red Hat.

À propos de Red Hat

Nous proposons des solutions renforcées qui facilitent le travail des entreprises sur plusieurs plates-formes et environnements, du centre de données central à la périphérie du réseau.

© 2024 Red Hat, Inc.