GNU/Linux >> Tutoriels Linux >  >> Linux

Comment fonctionnent les numéros SO (objet partagé) ?

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

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


Linux
  1. Comment faire fonctionner les permaliens WordPress dans Nginx

  2. Comment fonctionne Awk '!a[$0]++' ?

  3. Comment fonctionne le Sticky Bit ?

  4. Comment fonctionnent les composants internes de Sudo ?

  5. Ssh – Comment Tcp-keepalive fonctionne-t-il dans Ssh ?

Comment afficher les numéros de ligne dans Vim / Vi

Comment installer des ajouts d'invités dans Virtualbox VM

Comment travailler avec Ansible Provisioner dans Vagrant

Comment fonctionne la mémoire d'échange sous Linux ?

Comment :Introduction à la programmation - Programmation orientée objet

Comment afficher les numéros de ligne dans Gedit