La versione breve è che lo fai tramite il soname della biblioteca. Leggi il capitolo 3 su http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html e il capitolo 3.3 Versioning ABI su http://www.akkadia.org/drepper/dsohowto.pdf
Linux utilizza la seguente strategia:tu (il manutentore del sistema) fornisci collegamenti simbolici da un file di libreria condiviso 'specifico', come questo:
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
In questo modo, gli sviluppatori possono collegarsi a -lieee1284 (qualsiasi versione ABI), o libieee1284.so.3 o anche alla specifica release e versione patch (3.2.2)
Il modo migliore per gestirlo è usare libtool, che esegue il versioning per te.
In sostanza, le informazioni sulla versione non sono (o non principalmente, non lo so dalla mia testa) codificate nella libreria stessa, ma piuttosto nel suo nome file. I numeri di versione vengono normalmente forniti in formato a tre punti, con il numero maggiore che aumenta per ogni interruzione della compatibilità ABI verso il basso, il numero centrale per le interruzioni della compatibilità ABI verso l'alto e il numero minore per le patch che non hanno modificato l'ABI.
Come notato da qdot, i collegamenti simbolici nella directory lib forniscono il versioning essenziale. C'è un collegamento simbolico senza numero di versione (libfoo.so) per le intestazioni di sviluppo attualmente installate, un collegamento simbolico con un numero principale per ogni versione principale installata (libfoo.so.1) e un file reale con il numero di versione completo. Normalmente, i programmi sono collegati per utilizzare libfoo.so.1 in fase di esecuzione in modo che possano coesistere più versioni principali.