Le manuel de programmation de dpkg - chapitre 12
Les librairies partagées

Les paquets contenant les librairies partagées doivent être construits avec un peu de soin pour être sûr que les librairies partagées soient toujours disponibles. C'est spécialement important pour les paquets dont les librairies sont vitalement important, tel que la libc.

Tout d'abord, ton paquet devrait installer les librairies partagés sous leurs noms normaux. Par exemple, le paquet libgdbm1 devrait installer libgdbm.so.1.7.3 comme /usr/lib/libgdbm.so.1.7.3. Les fichiers ne devraient pas être renommés ou liés par les scripts prerm et postrm; dpkg s'occupera de renommer les choses doucement sans troubler les programmes exécutés et essayer d'interférer avec lui mène aux problèmes.

Ensuite, ton paquet doit inclure le lien symbolique que ldconfig doit créer pour les librairies partagées. Par exemple, le paquet libgdbm1 doit inclure un lien symbolique de /usr/lib/libgdbm.so.1.7.3 vers libgdbm.so.1.7.3. Ceci est nécessaire pour que ld.so trouve la librairie pendant que dpkg l'installe et ldconfig est exécuté dans le script postinst. De plus, et c'est important, la librairie doit être placée avant le lien qui pointe sur elle dans le fichier .deb. C'est afin que le temps que dpkg installe le lien symbolique (en écrasant le lien précédent pointant sur une version plus ancienne de la librairie), la nouvelle librairie soit déjà en place. Pour l'instant, la seule façon d'assurer que l'ordre est respecté est d'installer la librairie dans le répertoire debian/tmp/.../lib approprié avant de créer le lien symbolique, en mettant les commandes dans debian/rules dans l'ordre approprié.

Troisièmement, le paquet de développement devrait contenir un lien symbolique pour la librairie partagée sans un numéro de version. Par exemple, le paquet libgdbm1-dev devrait inclure un lien symbolique de /usr/lib/libgdbm.so vers libgdbm.so.1.7.3. Ce lien symbolique est nécessaire pour ld quand il compile les paquets, il cherchera seulement libgdbm.so et libgdbm.a pour compiler dynamiquement ou statiquement, respectivement.

Si tu fait ce qu'il y a au dessus, ton paquet n'a pas besoin d'appeler ldconfig dans ses scripts de maintenance. C'est spécialement important de ne pas appeler ldconfig dans les scripts postrm ou preinst dans le cas où le paquet est mis à jour voir Détails des phases d'installation et de mise à jour, section 6.3), étant donné que ldconfig verra les noms temporaires que dpkg utilise pour les fichiers pendant leur installation et fera les liens des librairies partagées pointer sur eux, juste avant que dpkg continue l'installation et enlève les liens !!!


12.1 Le format du fichier shlibs

Ce fichier est utilisé par dpkg-shlibdeps et est nécessaire quand ton paquet fourni des librairies partagées.

Chaque ligne est de la forme:

nom-librairie version-ou-ainsinommé dépendances ...
nom-librairie est le nom de la librairie partagée, par exemple libc5.

version-ou-ainsinommé est le nom de la librairie - c'est à dire la chose qui doit coller exactement pour que la librairie soit reconnue par ld.so. Généralement, c'est le numéro majeur de la version de la librairie.

dépendances a la même syntaxe que le champ dépendance dans le fichier de contrôle des paquets binaires. Il devrait donner les détails sur quels paquets sont nécessaires pour satisfaire une construction binaire par rapport à la version de librairie contenue dans le paquet. Voir La syntaxe des champs de relations, section 8.1.

Par exemple, si le paquet foo contient libfoo.so.1.2.3 ou le nom de la librairie est libfoo.so.1, et la première version du paquet qui contient les numéros mineurs d'au moins 2.3 était 1.2.3-1, alors le shlibs du paquet peut dire:

libfoo 1	foo (>= 1.2.3-1)
La dépendance de version spécifique est d'éviter les avertissements de ld.so sur l'utilisation des anciennes librairies partagées avec des nouveaux binaires.


12.2 Davantage d'informations techniques sur shlibs


12.2.1 Que sont les fichiers shlibs?

Le fichier debian/shlibs fournit une façon de vérifier les dépendances des librairies partagées des paquets binaires. Ils sont utilisés par les mainteneurs de paquet pour rendre leur vie plus facile.

Les autres fichiers shlibs qui existent sur un système Debian sont:

Ces fichiers sont utilisés par dpkg-shlibdeps à la création d'un paquet binaire.


12.2.2 Comment fonctionne dpkg-shlibdeps?

dpkg-shlibdeps appelle ldd pour déterminer les librairies partagées utilisées par les binaires compilés passés en paramètre sur sa ligne de commande.

Pour chaque librairie partagée, dpkg-shlibdeps a besoin de savoir

Il scrute le fichiers suivants dans l'ordre:
  1. debian/shlibs.local

  2. /etc/dpkg/shlibs.override

  3. /var/lib/dpkg/info/*.shlibs

  4. /etc/dpkg/shlibs.default


12.2.3 Qui maintient les nombreux fichiers shlibs?

Le fichier shlibs.default est géré par dpkg. Les entrées dans shlibs.default qui sont fournies par dpkg, sont juste là pour fixer les choses le temps que les paquets de librairie partagée ont toutes leurs fichiers shlibs.


12.2.4 Comment utiliser dpkg-shlibdeps et les fichiers shlibs?


12.2.4.1 Si ton paquet ne fournit pas de librairie partagée

Place un appel à dpkg-shlibs dans ton fichier debian/rules. Si ton paquet contient seulement des binaires (aucun scripts) utilise:
dpkg-shlibdeps debian/tmp/usr/{bin,sbin}/*
Si dpkg-shlibdeps ne se plaint pas, c'est bon. Sinon, tu dois créer ton propre fichier debian/shlibs.local.


12.2.4.2 Si ton paquet fournit une librairie partagée

Crée un fichier debian/shlibs et laisse debian/rules l'installer dans la zone de contrôle:
install -m644 debian/shlibs debian/tmp/DEBIAN
Si ton paquet contient des binaires supplémentaires voir ci-dessus.


12.2.5 Comment écrire debian/shlibs.local?

Ce fichier sert seulement à fixer temporairement si tes binaires ne dépendent pas d'une librairie qui ne fournit pas déjà son propre fichier /var/lib/dpkg/*.shlibs.

Supposons que tu crées un paquet binaire foo. Ta sortie doit ressembler à cela pendant la construction du paquet.

$ ldd foo
libbar.so.1 => /usr/X11R6/lib/libbar.so.1.0
libc.so.5 => /lib/libc.so.5.2.18
libX11.so.6 => /usr/X11R6/lib/libX11.so.6.0
Et quand tu exécutes dpkg-shlibdeps
$ dpkg-shlibdeps -o foo
dpkg-shlibdeps: warning unable to find dependency information
for shared library libbar
(soname 1, path /usr/X11R6/lib/libbar.so.1.0, dependency field Depends)
shlibs:Depends=elf-x11r6lib, libc5 (>= 5.2.18)
Le binaire foo dépend de la librairie partagée libbar , mais aucun paquet ne semblent fournir un fichier *.shlibs dans /var/lib/dpkg/info/. Déterminons le paquet responsable:
$ dpkg -S /usr/X11R6/lib/libbar.so.1.0
bar1: /usr/X11R6/lib/libbar.so.1.0
$ dpkg -s bar1 | grep Version
Version: 1.0-1
Ce qui nous indique que le paquet bar1, version 1.0-1 est celui qu'on utilise. Maintenant nous pouvons créer notre propre debian/shlibs.local pour fixer temporairement, les problèmes ci- dessus. Inclus la ligne suivante dans ton fichier debian/shlibs.local.
libbar1 bar1 (>= 1.0-1)
Maintenant ton paquet construit doit fonctionner. Dès que le mainteneur de libbar1 fournir un fichier shlibs, tu peux enlever ton fichier debian/shlibs.local.
Le manuel de programmation de dpkg - Copyright ©1996 Ian Jackson Copyright ©1997 David Curé et Christian Jacolot pour la version française.
Table des matières; résumé; suivant; précédent.
15 octobre 1998
D. Cure cure@cnam.fr
C. Jacolot jacolot@ubolib.univ-brest.fr