Ocultar símbolo (s) en objeto compartido de LD
-
22-07-2019 - |
Pregunta
Tengo dos bibliotecas de terceros que ocasionalmente exportan el mismo nombre de símbolo. Cuando se carga el ejecutable, ld generalmente elige el incorrecto y como resultado me cuelgo. No puedo hacer mucho sobre el contenido de estas bibliotecas, por lo que puede haber una manera de instruir a ld cómo encontrar la aplicación adecuada.
OS - Solaris 10, mi programa está construido por autoconf / autotools / gcc, las bibliotecas en conflicto son libclntsh (parte del controlador de Oracle) y OpenLDAP. Desafortunadamente, no puedo usar la implementación de Oracle del cliente LDAP; carece de muchas características que OpenLDAP tiene.
Editado: El enlace es el siguiente: libclntsh.so - > A.so - > MAIN < -B.so < -libldap_r.so
Solución
Si no necesita vincular ambas bibliotecas compartidas en el momento de la compilación (lo cual no está claro en su pregunta), puede usar -Bdirect
para la biblioteca compartida. Esto registrará todos los símbolos de la biblioteca compartida donde se encontraron; si luego, en tiempo de ejecución, aparece una segunda definición del símbolo (de la otra biblioteca compartida), se ignorará.
Otros consejos
Una solución es establecer la variable de entorno LD_PRELOAD
en la biblioteca cuyos símbolos deben tener prioridad. (Si esa biblioteca tiene dependencias de biblioteca compartidas propias, es posible que deba precargar todas sus dependencias; simplemente configure <=> en la lista de bibliotecas dependientes, separadas por espacios).