Linux (et d'autres UNIX) établit une distinction entre les éléments suivants nom d'un fichier (le lien ), le fichier lui-même (souvent identifié par le symbole inode ), et ouvrent des handles vers le fichier. Lorsque vous souhaitez supprimer un fichier, vous appelez la fonction unlink()
ce qui a pour effet d'effacer l'appel de lien dans le fichier (vous pouvez également utiliser rename()
pour l'écraser avec un inode différent). Cependant, si des handles ouverts vers le fichier (ou d'autres liens - les fichiers peuvent avoir plusieurs liens durs ) subsistent, le inode demeure, de même que le contenu du fichier, jusqu'à ce que tous les liens et les poignées disparaissent.
Les programmes en cours d'exécution qui utilisent la bibliothèque ou autre conservent donc un lien avec l'ancienne version (souvent de manière implicite par le biais d'un mappage mémoire), de sorte qu'elle reste sur le disque. Elle n'a simplement plus de nom de fichier et sera nettoyée lorsque tous les programmes qui l'utilisent s'arrêteront (ou au prochain redémarrage, lors de la vérification du système de fichiers ou de la relecture du journal).
De plus, notez que les programmes qui s'attendent à utiliser l'"ancienne bibliothèque" fonctionneront parfaitement avec les versions plus récentes de la bibliothèque. Les bibliothèques Linux se voient attribuer un nom de fichier ("soname") qui reflète la version de l'ABI (Application Binary Interface) proposée par la bibliothèque. Par exemple, la bibliothèque C de mon système s'appelle libc.so.6
. Tout programme compilé avec une version plus ancienne de libc, mais toujours une version de libc implémentant l'ABI de la version 6, fonctionnera correctement avec elle. Les très vieux programmes chercheront un fichier libc.so.5
ou libc.so.4
ou quelque chose d'autre à la place ; dans ce cas, vous devrez également conserver l'ancienne version - mais comme le nom de fichier est différent, ce n'est pas un problème.