La versión corta es que haces esto a través del soname de la biblioteca. Lea el capítulo 3 en http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html, así como el capítulo 3.3 Versiones ABI en http://www.akkadia.org/drepper/dsohowto.pdf
Linux utiliza la siguiente estrategia:usted (el mantenedor del sistema) proporciona enlaces simbólicos de un archivo de biblioteca compartido 'específico', como este:
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 esta forma, los desarrolladores pueden vincularse con -lieee1284 (cualquier versión ABI) o libieee1284.so.3 o incluso con la versión específica del lanzamiento y parche (3.2.2)
La mejor manera de manejar esto es usando libtool, que hace el control de versiones por usted.
Esencialmente, la información de la versión no está (o no principalmente, no lo sé por mi cabeza) codificada en la biblioteca en sí, sino en su nombre de archivo. Los números de versión normalmente se dan en formato de tres puntos, con el número mayor aumentando por cada interrupción en la compatibilidad ABI descendente, el medio para interrupciones en la compatibilidad ABI ascendente y el menor para parches que no cambiaron la ABI.
Como señaló qdot, los enlaces simbólicos en el directorio lib proporcionan el control de versiones esencial. Hay un enlace simbólico sin número de versión (libfoo.so) para los encabezados de desarrollo actualmente instalados, un enlace simbólico con un número principal para cada versión principal instalada (libfoo.so.1) y un archivo real con el número de versión completo. Normalmente, los programas están vinculados para usar libfoo.so.1 en tiempo de ejecución para que puedan coexistir varias versiones principales.