dpkg-shlibdeps - Générateur de variables de substitution de
dépendances pour bibliothèques partagées
dpkg-shlibdeps [
option...] [
-e]
exécutable
[
option...]
dpkg-shlibdeps calcule, pour les exécutables indiqués dans
ses paramètres, les dépendances envers les bibliothèques
partagées. Ces dépendances sont ajoutées au fichier de
variables de substitution
debian/substvars sous la forme
shlibs:champ-dépendance où
champ-dépendance est le nom du champ de dépendance. Toute
autre variable après
shlibs: est supprimée du fichier.
dpkg-shlibdeps a deux sources possibles pour créer les
informations concernant les dépendances, soit les fichiers
symbols, soit les fichiers
shlibs. Pour chaque fichier binaire
qu'il analyse,
dpkg-shlibdeps recherche la liste des
bibliothèques partagées qui lui sont liées. Puis, pour
chacune d'elles il analyse soit le fichier
symbols, soit le fichier
shlibs (si le premier n'existe pas ou si debian/shlibs.local contient
les dépendances appropriées). Ces deux fichiers sont
censés être fournis par le paquet de la bibliothèque et
disponibles dans /var/lib/dpkg/info/
paquet.
symbols ou
/var/lib/dpkg/info/
paquet.
shlibs. Le nom du paquet est
trouvé en deux étapes : en cherchant le fichier de la
bibliothèque sur le système, dans le répertoire que
ld.so utiliserait, puis en utilisant
dpkg -S
fichier-bibliothèque pour trouver le paquet qui fournit cette
bibliothèque.
Les fichiers symboles contiennent des informations de dépendances plus
fines en fournissant les dépendances minimales pour chaque symbole de
la bibliothèque exportée. Le script essaie de trouver un fichier
de symboles associé à un paquet de bibliothèque dans les
emplacements suivants (le premier trouvé est utilisé) :
- debian/*/DEBIAN/symbols
- Les informations de bibliothèque partagée
générées par l'actuel processus de construction qui
invoque aussi dpkg-shlibdeps. Elles sont
générées par dpkg-gensymbols(1) et ne sont
utilisées que si la bibliothèque se trouve dans l'arbre de
construction d'un paquet. Le fichier des symboles qui construit l'arbre
s'appuie sur les fichiers de symboles d'autres paquets binaires.
- /etc/dpkg/symbols/paquet.symbols.architecture
- /etc/dpkg/symbols/paquet.symbols
- Les informations de dépendance de
bibliothèque partagée principales par système.
arch est l'architecture du système actuel (obtenue par
dpkg-architecture -qDEB_HOST_ARCH).
- Affichage de “dpkg-query --control-path
paquet symbols”
- Les informations de dépendance de
bibliothèque partagée fournies par le paquet. Sauf
indication contraire par le biais de --admindir, ces fichiers sont
par défaut dans /var/lib/dpkg.
Lors de l'analyse des symboles utilisés par tous les binaires,
dpkg-shlibdeps retient la (plus grande) version minimale
nécessaire pour chaque bibliothèque. À la fin du
processus, il est capable d'écrire la dépendance minimale pour
toutes les bibliothèques utilisées (à condition que
l'information des fichiers
symbols soit exacte).
Comme garde-fou, un fichier de symboles peut fournir un champ
Build-Depends-Package de méta-information et
dpkg-shlibdeps en extraira la version minimale requise par le paquet
correspondant depuis ce champ
Build-Depends et utilisera cette version
si elle est supérieure à la version minimale calculée par
l'examen des symboles.
Les fichiers Shlibs associent directement une bibliothèque à une
dépendance (sans regarder les symboles). C'est donc souvent plus
puissant que les besoins réels mais cela reste très sûr
et facile à manipuler.
Les dépendances d'une bibliothèque sont recherchées
à plusieurs endroits. Le premier fichier d'informations trouvé
qui concerne la bibliothèque est utilisé :
- debian/shlibs.local
- Fichier particulier à un paquet remplaçant
les informations qui concernent les dépendances envers des
bibliothèques partagées.
- /etc/dpkg/shlibs.override
- Fichier système remplaçant les informations
qui concernent les dépendances envers des bibliothèques
partagées.
- debian/*/DEBIAN/shlibs
- Information sur la bibliothèque partagée
générée par le processus actuel de construction qui
invoque aussi dpkg-shlibdeps. Il n'est utilisé que si la
bibliothèque se trouve dans l'arbre de construction du paquet. Le
fichier shlibs qui construit l'arbre a priorité sur les fichiers
shlibs des autres paquets binaires.
- Affichage de
« dpkg-query --control-path paquet
shlibs »
- Les informations de dépendance de
bibliothèque partagée fournies par le paquet. Sauf
indication contraire par le biais de --admindir, ces fichiers sont
par défaut dans /var/lib/dpkg.
- /etc/dpkg/shlibs.default
- Fichier système par défaut concernant les
informations de dépendance envers des bibliothèques
partagées.
Les dépendances trouvées sont ensuite directement utilisées
(sauf si elles sont filtrées parce qu'elles ont été
identifiées comme étant en double, ou d'un niveau plus faible
qu'une autre dépendance).
dpkg-shlibdeps interprète des arguments sans option comme des
commandes exécutables, comme si on avait simplement donné
-e exécutable.
-
-eexécutable
- Cette option inclut les bonnes dépendances envers
les bibliothèques partagées que demande
exécutable. Cette option peut être utilisée
plusieurs fois.
-
-lrépertoire
- Ajoute répertoire au début de la liste
des répertoires où chercher des bibliothèques
partagées privées (depuis dpkg 1.17.0). Cette option
peut être utilisée plusieurs fois.
Note : Utilisez cette option plutôt que le
réglage de LD_LIBRARY_PATH, parce que cette variable
d'environnement est utilisée pour contrôler l'éditeur
de liens d'exécution et se servir d'elle pour définir les
chemins des bibliothèques partagées au moment de la
construction peut être problématique, par exemple, lors
d'une compilation croisée.
-
-dchamp-dépendance
- Cette option ajoute les dépendances destinées
au champ « dépendance » du fichier de
contrôle champ-dépendance. (Les dépendances
pour ce champ sont dans la variable
shlibs:champ-dépendance.)
L'option -dchamp-dépendance concerne tous les
exécutables qui suivent l'option, jusqu'à la prochaine
option -dchamp-dépendance. Par défaut,
champ-dépendance vaut Depends.
Quand, dans plusieurs champs reconnus ayant trait aux dépendances
comme les champs Pre-Depends, Depends, Recommends,
Enhances ou Suggests apparaît la même
entrée (ou bien un ensemble d'alternatives), dpkg-shlibdeps
supprime automatiquement les dépendances dans tous les champs sauf
celui qui représente les dépendances les plus
importantes.
-
-ppréfixe-pour-le-nom-des-variables
- Fait commencer les variables de substitution par
préfixe-pour-le-nom-des-variables : au lieu de
shlibs:. De même, toute variable de substitution
commençant par
préfixe-pour-le-nom-des-variables: (au lieu de
shlibs:) est enlevée du fichier de substitution des
variables.
-
-O[nom-de-fichier]
- Affiche les définitions des variables de
substitution sur la sortie standard (ou nom-de-fichier si
spécifié, depuis dpkg 1.17.2), plutôt que de
les ajouter dans le fichier de substitution des variables qui est par
défaut debian/substvars.
-
-ttype
- Préférer les informations sur les
dépendances des bibliothèques partagées qui sont
étiquetées pour un type de paquet donné. Si aucune
information de type n'est donnée, il n'utilisera pas d'information.
Par défaut, le type de paquet est deb. On peut créer
une étiquette pour ces informations en les préfixant par le
nom du type, un deux-points et une espace.
-
-Lfichier-local-shlibs
- Lire les informations de remplacement concernant les
dépendances envers les bibliothèques partagées dans
fichier-local-shlibs au lieu de debian/shlibs.local.
-
-Tfichier-substvars
- Écrire les variables de substitution dans
fichier-substvars ; le fichier par défaut est
debian/substvars.
- -v
- Active le mode bavard (depuis dpkg 1.14.8). De
nombreux messages sont affichés pour expliquer ce que
dpkg-shlibdeps fait.
-
-xpackage
- Exclut le paquet des dépendances
générées (depuis dpkg 1.14.8). Cela
évite les auto-dépendances pour les paquets fournissant des
exécutables ELF (exécutables ou modules
complémentaires de bibliothèque) qui utilisent une
bibliothèque incluse dans ce même paquet. Cette option peut
être utilisée plusieurs fois pour exclure plusieurs
paquets.
-
-Srépertoire-construction-paquet
- Recherche dans répertoire-construction-paquet
en premier et essaie de trouver une bibliothèque (depuis
dpkg 1.14.15). C'est utile lorsque le paquet source construit
plusieurs saveurs de la même bibliothèque et que vous voulez
vous assurer que vous obtiendrez la dépendance d'un paquet binaire
donné. Cette option peut être utilisée plusieurs
fois : les répertoires seront examinés dans le
même ordre avant les répertoires d'autres paquets
binaires.
-
-Irépertoire-construction-paquet
- Ignore répertoire-construction-paquet lors de
la recherche des fichiers shlibs, de symboles et des bibliothèques
partagées (depuis dpkg 1.18.5). Cette option peut
être utilisée plusieurs fois.
- --ignore-missing-info
- Pas d'échec si l'information de dépendance ne
peut pas être trouvée pour une bibliothèque
partagée (depuis dpkg 1.14.8). L'utilisation de cette option
est déconseillée, toutes les bibliothèques devraient
fournir leurs informations de dépendance (que ce soit avec les
fichiers shlibs, ou avec les fichiers symboles), même si elles ne
sont pas encore utilisées par d'autres paquets.
-
--warnings=valeur
-
valeur est un champ de
« bit » définissant l'ensemble des
avertissements qui peuvent être émis par
dpkg-shlibdeps (depuis dpkg 1.14.17). Le bit 0
(valeur = 1) active l'avertissement « symbole sym
utilisé par le binaire trouvé dans aucune des
bibliothèques ». Le bit 1 (valeur = 2) active
l'avertissement « le paquet pourrait éviter une
dépendance inutile ». Le bit 2 (valeur = 4)
active l'avertissement « Le binaire ne devrait pas
être lié à
bibliothèque ». La valeur par
défaut est 3 : les deux premières mises en
garde sont actives par défaut, la dernière ne l'est pas.
Positionnez la valeur à 7 si vous souhaitez que tous les
avertissements soient actifs.
-
--admindir=répertoire
- Changer l'endroit où se trouve la base de
données de dpkg (depuis dpkg 1.14.0). Par défaut,
c'est /var/lib/dpkg.
-
-?, --help
- Afficher un message d'aide puis quitter.
- --version
- Afficher le numéro de version puis quitter.
- DPKG_COLORS
- Définit le mode de couleur (depuis
dpkg 1.18.5). Les valeurs actuellement acceptées sont
auto (par défaut), always et never.
- DPKG_NLS
- Si cette variable est définie, elle sera
utilisée pour décider l'activation de la prise en charge des
langues (NLS – Native Language Support), connu aussi comme la
gestion de l'internationalisation (ou i18n) (depuis dpkg 1.19.0).
Les valeurs permises sont : 0 et 1 (par
défaut).
Depuis que
dpkg-shlibdeps analyse l'ensemble des symboles utilisés
par chaque binaire généré par le paquet, il est en mesure
d'émettre des avertissements dans plusieurs cas. Ils vous informent des
choses qui peuvent être améliorées dans le paquet. Dans
la plupart des cas, ces améliorations concernent directement les
sources amont. Dans l'ordre d'importance décroissant, voici les
différents avertissements que vous pouvez rencontrer :
-
symbole sym utilisé par
binaire trouvé dans aucune des
bibliothèques.
- Le symbole indiqué n'a pas été
trouvé dans les bibliothèques liées au binaire. Le
binaire est probablement plutôt une bibliothèque et
il doit être lié avec une bibliothèque
supplémentaire durant le processus de construction (l'option
-l bibliothèque de l'éditeur de liens).
-
binary contient une référence non
résolue au symbole sym : il s'agit probablement d'un
greffon (plugin)
- Le symbole indiqué n'a pas été
trouvé dans les bibliothèques liées avec le fichier
binaire. Le binaire est très probablement un greffon
(plugin) et le symbole est probablement fourni par le programme qui charge
ce greffon. En théorie, un greffon n'a pas de
« SONAME » mais ce binaire en possède
un et n'a pas pu être identifié en tant que tel. Cependant,
le fait que le binaire soit stocké dans un répertoire non
public est une indication forte qu'il ne s'agit pas d'une
bibliothèque partagée normale. Si le binaire est vraiment un
greffon, vous pouvez ignorer cet avertissement. Il existe cependant une
possibilité qu'il s'agisse d'un vrai binaire et que les programmes
avec lequel il est lié utilisent un RPATH afin que le chargeur
dynamique le trouve. Dans ce cas, la bibliothèque est incorrecte et
doit être corrigée.
-
paquet pourrait éviter une dépendance
inutile si le binaire n'était pas lié avec
bibliothèque (il ne fait usage d'aucun de ses
symboles)
- Aucun des binaires liés à la
bibliothèque n'utilise les symboles qu'elle fournit. En
corrigeant tous les binaires, vous éviteriez la dépendance
associée à cette bibliothèque (à moins que la
même dépendance soit également liée à
une autre bibliothèque qui est elle réellement
utilisée).
-
paquet pourrait éviter une dépendance
inutile si les binaires n'étaient pas liés
avec bibliothèque (ils ne font usage d'aucun de ses
symboles)
- Identique à l'avertissement précédent,
pour des binaires multiples.
-
le binaire ne devrait pas être lié
avec la bibliothèque (il ne fait usage d'aucun de ses
symboles)
- Le binaire est lié à une
bibliothèque dont il n'a pas besoin. Ce n'est pas un
problème, mais de petites améliorations de performance dans
le temps de chargement de celui-ci peuvent être obtenues en ne le
liant pas à cette bibliothèque. Cet avertissement
vérifie la même information que la précédente
mais elle le fait pour tous les binaires au lieu de ne faire le
contrôle qu'au niveau global sur tous les binaires
analysés.
dpkg-shlibdeps échouera s'il ne peut pas trouver de
bibliothèque publique utilisée par un binaire ou si cette
bibliothèque n'a pas d'informations sur les dépendances
associées (soit le fichier shlibs, soit le fichier des symboles). Une
bibliothèque publique a un SONAME et un numéro de version
(libsomething.so.
X). Une bibliothèque privée (comme un
module additionnel) ne devrait pas avoir de SONAME et n'a pas besoin d'avoir
de version.
-
impossible de trouver la bibliothèque
library-soname demandée par le binaire (son
RPATH est « rpath »)
- Le binaire utilise une bibliothèque
appelée library-soname mais dpkg-shlibdeps n'a pas
été en mesure de trouver cette bibliothèque.
dpkg-shlibdeps crée une liste de répertoires à
vérifier de la manière suivante : les
répertoires énumérés dans le RPATH du binaire,
les répertoires ajoutés par l'option -l, les
répertoires listés dans la variable d'environnement
LD_LIBRARY_PATH, les répertoires croisés
multi-architerctures (par exemple, /lib/arm64-linux-gnu,
/usr/lib/arm64-linux-gnu), les répertoires publics standard (/lib,
/usr/lib), les répertoires listés dans /etc/ld.so.conf et
les répertoires obsolètes multilib (/lib32, /usr/lib32,
/lib64, /usr/lib64). Ensuite, il vérifie les répertoires qui
sont dans l'arbre de construction du paquet binaire en cours d'analyse,
dans l'arbre de construction du paquet indiqué avec l'option de
ligne de commande -S, dans les autres arbres de paquets qui
contiennent un fichier DEBIAN/shlibs ou DEBIAN/symbols et enfin dans le
répertoire racine. Si la bibliothèque n'est pas
trouvée dans l'un de ces répertoires, alors ce message
d'erreur est obtenu.
Si la bibliothèque non trouvée est cependant disponible dans
le répertoire privé de ce même paquet, alors il vous
faut ajouter ce répertoire avec -l. S'il est dans un autre
paquet binaire en cours de construction, alors assurez-vous que le fichier
shlibs/symbols de ce paquet a déjà créé et que
-l contient le répertoire approprié si c'est aussi un
répertoire privé.
-
aucune information de dépendance trouvée
pour la bibliothèque (utilisée par le
binaire ).
- La bibliothèque nécessaire au binaire
a été trouvée par dpkg-shlibdeps dans
fichier-bibliothèque mais dpkg-shlibdeps n'a pas
été en mesure de trouver d'informations de dépendance
pour cette bibliothèque. Pour trouver la dépendance, il a
essayé de lier la bibliothèque à un paquet Debian
avec l'aide de dpkg -S fichier-bibliothèque. Puis, il
a vérifié les shlibs correspondants et les fichiers symboles
de /var/lib/dpkg/info/ et enfin les différents arbres des paquets
construits (debian/*/DEBIAN/).
Cet échec peut être causé par un shlibs ou un fichier
de symboles qui serait mauvais ou manquant dans le paquet. Une autre cause
serait que la bibliothèque soit construite au sein du même
paquet source et que les fichiers shlibs n'aient pas encore
été créés (dans ce cas debian/rules doit
être modifié pour créer le shlibs avant l'appel de
dpkg-shlibdeps). Un mauvais RPATH peut aussi conduire à ce
que la bibliothèque soit trouvée sous un nom non canonique
(comme : /usr/lib/openoffice.org/../lib/libssl.so.0.9.8 au lieu de
/usr/lib/libssl.so.0.9.8) qui n'est associé à aucun paquet,
dpkg-shlibdeps essaie de contourner cela en se repliant vers un nom
canonique (en utilisant realpath(3)), mais cela ne fonctionne pas
toujours. Il est toujours préférable de bien nettoyer le
RPATH du binaire afin d'éviter ces problèmes.
L'appel de dpkg-shlibdeps en mode bavard (-v) fournira
beaucoup plus d'informations sur l'endroit où il a essayé de
trouver l'information sur les dépendances. Cela peut être
utile si vous ne comprenez pas pourquoi vous obtenez cette erreur.
deb-substvars(5),
deb-shlibs(5),
deb-symbols(5),
dpkg-gensymbols(1).
Ariel VARDI <
[email protected]>, 2002. Philippe Batailler, 2006.
Nicolas François, 2006. Veuillez signaler toute erreur à
<
[email protected]>.