Estoy tratando de aprender más sobre el versionado de bibliotecas en Linux y cómo ponerlo a funcionar. Aquí está el contexto:
- Tengo dos versiones de una biblioteca dinámica que exponen el mismo conjunto de interfaces, digamos libsome1.so
y libsome2.so
.
- Una aplicación está vinculada contra libsome1.so
.
- Esta aplicación utiliza libdl.so
para cargar dinámicamente otro módulo, por ejemplo libmagic.so
.
- Ahora libmagic.so
está vinculado en contra libsome2.so
. Obviamente, sin usar scripts de enlazador para ocultar símbolos libmagic.so
, en tiempo de ejecución libsome2.so
se resuelven todas las llamadas a las interfaces libsome1.so
. Esto puede confirmarse comprobando el valor devuelto por libVersion()
el valor de la macro LIB_VERSION
.
- Entonces trato de compilar y vincular libmagic.so
con un script vinculador que oculta todos los símbolos, excepto 3, que se definen libmagic.so
y exportan. Esto funciona ... O al menos libVersion()
y los LIB_VERSION
valores coinciden (e informa la versión 2 no 1).
- Sin embargo, cuando algunas estructuras de datos se serializan en el disco, noté algo de corrupción. En el directorio de la aplicación, si elimino libsome1.so
y creo un enlace suave en su lugar para señalar libsome2.so
, todo funciona como se espera y no ocurre la misma corrupción.
No puedo evitar pensar que esto puede deberse a algún conflicto en la resolución de símbolos del enlazador en tiempo de ejecución. He intentado muchas cosas, como intentar vincular libsome2.so
para que todos los símbolos estén alineados symbol@@VER_2
(lo cual todavía estoy confundido porque el comando nm -CD libsome2.so
todavía enumera símbolos como symbol
y no symbol@@VER_2
) ... ¡Parece que nada funciona! ¡¡¡¡¡¡Ayuda!!!!!!
RTLD_LOCAL
y RTLD_DEEPBIND
dlopen en su aplicación. No tengo tiempo para probar esto ahora, pero debería funcionar según la página de manual.