Les binaires eux-mêmes savent de quelle version d'une bibliothèque partagée ils dépendent et la demandent spécifiquement. Vous pouvez utiliser ldd
pour montrer les dépendances ; le mien pour ls
sont :
$ ldd /bin/ls
linux-gate.so.1 => (0xb784e000)
librt.so.1 => /lib/librt.so.1 (0xb782c000)
libacl.so.1 => /lib/libacl.so.1 (0xb7824000)
libc.so.6 => /lib/libc.so.6 (0xb76dc000)
libpthread.so.0 => /lib/libpthread.so.0 (0xb76c3000)
/lib/ld-linux.so.2 (0xb784f000)
libattr.so.1 => /lib/libattr.so.1 (0xb76bd000)
Comme vous pouvez le voir, il pointe par ex. libpthread.so.0
, pas seulement libpthread.so
.
La raison du lien symbolique est pour l'éditeur de liens. Lorsque vous souhaitez créer un lien avec libpthread.so
directement, vous donnez gcc
le drapeau -lpthread
, et il ajoute sur le lib
préfixe et .so
suffixe automatiquement. Vous ne pouvez pas lui dire d'ajouter le .so.0
suffixe, de sorte que le lien symbolique pointe vers la version la plus récente de la bibliothèque pour faciliter cela
Les nombres dans les bibliothèques partagées sont une convention utilisée sous Linux pour identifier l'API d'une bibliothèque. Généralement, le format est :
libFOO.so.MAJOR.MINOR
Et comme vous l'avez remarqué, il existe généralement un lien symbolique entre libFOO.so et libFOO.so.MAJOR.MINOR. ldconfig est responsable de la mise à jour de ce lien vers la version la plus récente.
Le MAJOR est généralement incrémenté lorsque l'API change (de nouveaux points d'entrée sont supprimés ou les paramètres ou les types sont modifiés). Le MINEUR est généralement incrémenté pour les versions de correctifs de bogues ou lorsque de nouvelles API sont introduites sans casser les API existantes.
Une discussion plus approfondie peut être trouvée ici :Dissection des bibliothèques partagées
Les bibliothèques partagées doivent être versionnées selon le schéma suivant :
blah.so.X.Y.Z
où
- X =version ABI rétrocompatible
- Y =version ABI rétrocompatible
- Z =Modifications internes uniquement - pas de modification de l'ABI
Généralement, vous ne voyez que le premier chiffre comme hello.so.1
car le premier chiffre est la seule chose nécessaire pour identifier la "version" de la bibliothèque puisque tous les autres chiffres sont rétrocompatibles.
ldconfig
maintient une table des bibliothèques partagées disponibles sur un système et où se trouve le chemin d'accès à cette bibliothèque. Vous pouvez le vérifier en exécutant :
ldconfig -p
Lorsqu'un paquet est construit pour quelque chose comme Red Hat, les bibliothèques partagées appelées dans le binaire seront recherchées et ajoutées en tant que dépendances du paquet au moment de la construction RPM. Par conséquent, lorsque vous allez installer le package, le programme d'installation recherchera si oui ou non hello.so.1
est installé sur le système en cochant ldconfig
.
Vous pouvez voir les dépendances d'un paquet en faisant quelque chose comme :
rpm -qpR hello.rpm
Ce système (contrairement à Windows) permet plusieurs versions du hello.so
pour être installé sur un système et être utilisé par différentes applications en même temps.