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.soy libsome2.so.
- Una aplicación está vinculada contra libsome1.so.
- Esta aplicación utiliza libdl.sopara cargar dinámicamente otro módulo, por ejemplo libmagic.so.
- Ahora libmagic.soestá vinculado en contra libsome2.so. Obviamente, sin usar scripts de enlazador para ocultar símbolos libmagic.so, en tiempo de ejecución libsome2.sose 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.socon un script vinculador que oculta todos los símbolos, excepto 3, que se definen libmagic.soy exportan. Esto funciona ... O al menos libVersion()y los LIB_VERSIONvalores 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.soy 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.sopara que todos los símbolos estén alineados symbol@@VER_2(lo cual todavía estoy confundido porque el comando nm -CD libsome2.sotodavía enumera símbolos como symboly no symbol@@VER_2) ... ¡Parece que nada funciona! ¡¡¡¡¡¡Ayuda!!!!!!
RTLD_LOCALy RTLD_DEEPBINDdlopen en su aplicación. No tengo tiempo para probar esto ahora, pero debería funcionar según la página de manual.