La version courte est que vous faites cela via le soname de la bibliothèque. Lisez le chapitre 3 sur http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html ainsi que le chapitre 3.3 ABI Versioning sur http://www.akkadia.org/drepper/dsohowto.pdf
Linux utilise la stratégie suivante :vous (le responsable du système) fournissez des liens symboliques à partir d'un fichier de bibliothèque partagée "spécifique", comme ceci :
lrwxrwxrwx 1 root root 16 2011-09-22 14:36 libieee1284.so -> libieee1284.so.3
lrwxrwxrwx 1 root root 20 2011-09-22 14:36 libieee1284.so.3 -> libieee1284.so.3.2.2
-rw-r--r-- 1 root root 46576 2011-07-27 13:08 libieee1284.so.3.2.2
De cette façon, les développeurs peuvent établir un lien soit avec -lieee1284 (toute version ABI), soit avec libieee1284.so.3 ou même avec la version spécifique et la version du correctif (3.2.2)
La meilleure façon de gérer cela est d'utiliser libtool, qui s'occupe de la gestion des versions pour vous.
Essentiellement, les informations de version ne sont pas (ou pas principalement, je ne sais pas de ma tête) encodées dans la bibliothèque elle-même, mais plutôt dans son nom de fichier. Les numéros de version sont normalement donnés au format à trois points, le numéro majeur augmentant pour chaque interruption de la compatibilité descendante de l'ABI, le numéro du milieu pour les interruptions de la compatibilité ascendante de l'ABI et le mineur pour les correctifs qui n'ont pas modifié l'ABI.
Comme indiqué par qdot, les liens symboliques dans le répertoire lib fournissent la version essentielle. Il existe un lien symbolique sans numéro de version (libfoo.so) pour les en-têtes de développement actuellement installés, un lien symbolique avec un numéro majeur pour chaque version majeure installée (libfoo.so.1) et un vrai fichier avec le numéro de version complet. Normalement, les programmes sont liés pour utiliser libfoo.so.1 lors de l'exécution afin que plusieurs versions majeures puissent coexister.