Red Hat Training

A Red Hat training course is available for RHEL 8

4.2. El mecanismo de soname

Las bibliotecas cargadas dinámicamente (objetos compartidos) utilizan un mecanismo llamado soname para gestionar múltiples versiones compatibles de una biblioteca.

Requisitos previos

Introducción del problema

Una biblioteca cargada dinámicamente (objeto compartido) existe como un archivo ejecutable independiente. Esto permite actualizar la biblioteca sin actualizar las aplicaciones que dependen de ella. Sin embargo, este concepto plantea los siguientes problemas:

  • Identificación de la versión actual de la biblioteca
  • Necesidad de contar con varias versiones de la misma biblioteca
  • Señalización de la compatibilidad ABI de cada una de las múltiples versiones

El mecanismo de soname

Para resolver esto, Linux utiliza un mecanismo llamado soname.

Una biblioteca foo versión X.Y es ABI-compatible con otras versiones con el mismo valor de X en un número de versión. Los cambios menores que preservan la compatibilidad aumentan el número Y. Los cambios mayores que rompen la compatibilidad aumentan el número X.

La versión real de la biblioteca foo X.Y existe como un archivo libfoo.so.x.y. Dentro del archivo de la biblioteca, se registra un soname con el valor libfoo.so.x para señalar la compatibilidad.

Cuando se construyen las aplicaciones, el enlazador busca la biblioteca buscando el archivo libfoo.so. Debe existir un enlace simbólico con este nombre, que apunte al archivo real de la biblioteca. A continuación, el enlazador lee el nombre del archivo de la biblioteca y lo registra en el archivo ejecutable de la aplicación. Por último, el enlazador crea la aplicación que declara la dependencia de la biblioteca utilizando el soname, no un nombre o un nombre de archivo.

Cuando el enlazador dinámico en tiempo de ejecución enlaza una aplicación antes de ejecutarla, lee el soname del archivo ejecutable de la aplicación. Este soname es libfoo.so.x. Debe existir un enlace simbólico con este nombre, que apunte al archivo real de la biblioteca. Esto permite cargar la biblioteca, independientemente del componente Y de una versión, porque el soname no cambia.

Nota

El componente Y del número de versión no se limita a un solo número. Además, algunas bibliotecas codifican su versión en su nombre.

Lectura del nombre de un archivo

Para mostrar el nombre de un archivo de la biblioteca somelibrary:

$ objdump -p somelibrary | grep SONAME

Sustituya somelibrary por el nombre de archivo real de la biblioteca que desea examinar.