Los propios binarios saben de qué versión de una biblioteca compartida dependen y la solicitan específicamente. Puedes usar ldd
para mostrar las dependencias; el mío para ls
son:
$ 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)
Como puede ver, apunta a, p. libpthread.so.0
, no solo libpthread.so
.
El motivo del enlace simbólico es para el enlazador. Cuando quieras enlazar contra libpthread.so
directamente le das gcc
la bandera -lpthread
, y agrega el lib
prefijo y .so
sufijo automáticamente. No puedes decirle que agregue el .so.0
sufijo, por lo que el enlace simbólico apunta a la versión más reciente de lib para facilitar eso
Los números en las bibliotecas compartidas son una convención utilizada en Linux para identificar la API de una biblioteca. Normalmente, el formato es:
libFOO.so.MAJOR.MINOR
Y como notó, generalmente hay un enlace simbólico de libFOO.so a libFOO.so.MAJOR.MINOR. ldconfig es responsable de actualizar este enlace a la versión más reciente.
El PRINCIPAL generalmente se incrementa cuando cambia la API (se eliminan nuevos puntos de entrada o se cambian los parámetros o tipos). El MENOR generalmente se incrementa para las versiones de corrección de errores o cuando se introducen nuevas API sin romper las API existentes.
Se puede encontrar una discusión más extensa aquí:Disección de bibliotecas compartidas
Las bibliotecas compartidas se deben versionar de acuerdo con el siguiente esquema:
blah.so.X.Y.Z
donde
- X =versión de ABI incompatible con versiones anteriores
- Y =versión ABI compatible con versiones anteriores
- Z =Solo cambios internos, sin cambios en la ABI
Por lo general, solo verá el primer dígito como hello.so.1
porque el primer dígito es lo único que se necesita para identificar la "versión" de la biblioteca, ya que todos los demás dígitos son compatibles con versiones anteriores.
ldconfig
mantiene una tabla de qué bibliotecas compartidas están disponibles en un sistema y dónde existe la ruta a esa biblioteca. Puede verificar esto ejecutando:
ldconfig -p
Cuando se construye un paquete para algo como Red Hat, las bibliotecas compartidas que se llaman en el binario se buscarán y agregarán como dependencias del paquete en el momento de la construcción de RPM. Por lo tanto, cuando vaya a instalar el paquete, el instalador buscará si hello.so.1
se instala en el sistema marcando ldconfig
.
Puede ver las dependencias de un paquete haciendo algo como:
rpm -qpR hello.rpm
Este sistema (a diferencia de Windows) permite múltiples versiones del hello.so
para ser instalado en un sistema y ser utilizado por diferentes aplicaciones al mismo tiempo.