Tengo una aplicación que enlaza estáticamente con la versión X de una biblioteca, libfoo, del proveedor de terceros, VENDOR1. También se vincula con una biblioteca dinámica (compartida), libbar, de un proveedor de terceros diferente, VENDOR2, que vincula estáticamente la versión Y de libfoo desde VENDOR1.Vinculación con múltiples versiones de una biblioteca
contiene Así libbar.so versión Y del libfoo.a y mi ejecutable contiene la versión X de libfoo.a libbar sólo utiliza libtal internamente y no hay objetos libfoo pasaron de mi aplicación a libbar.
No hay errores en el tiempo de compilación, pero en el tiempo de ejecución la aplicación seg falla. La razón parece ser que la versión X usa estructuras que tienen un tamaño diferente que la versión Y y el enlazador en tiempo de ejecución parece estar mezclando, lo cual se usa para cada una.
Ambos VENDOR1 & VENDOR2 son de fuente cerrada, por lo que no puedo reconstruirlos.
¿Hay alguna manera de compilar/vincular mi aplicación de manera que siempre se resuelva en la versión X y libbar siempre se resuelve en la versión Y y las dos nunca se mezclan?
¿Puedes hacer que tu aplicación se vincule dinámicamente con VENDOR1? –
No es de ninguna manera que es un idioma neutral. Esto es muy específico para el enlazador del compilador y el sistema operativo, ya que todos estos funcionan juntos. La forma más fácil es enviar un correo electrónico a ambos vendedores y ver cómo lo resuelven. –
Nuestro pensamiento actual es, al menos en Linux, usar dlopen() en libbar.so con el indicador RTLD_DEEPBIND. Otra posibilidad es separar el uso de aplicaciones de libfoo.a en una biblioteca compartida, libbaz.so que envuelve el uso de libfoo.a, luego tener la aplicación dlopen libbaz.so y libbar.so con RTLD_LOCAL que creemos que podría mantener todo los símbolos duplicados internos. Esto puede funcionar para Linux, pero lo necesitamos así que trabaje en Solaris, AIX y HPUX también. – YerBlues