gcc - Ocultar símbolo(s) en objeto compartido de LD
linker solaris (2)
Tengo dos bibliotecas de terceros que ocasionalmente tienen el mismo nombre de símbolo exportado. Cuando se carga el ejecutable, ld por lo general elige el incorrecto y como resultado me cuelgo. No puedo hacer demasiado sobre el contenido de estas bibliotecas, ¿puede ser que haya una manera de instruir a ld cómo encontrar la imlementación adecuada?
SO - 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, ya que le faltan muchas características que tiene OpenLDAP.
Editado: El enlace es el siguiente: libclntsh.so-> A.so-> MAIN <-B.so <-libldap_r.so
Si no necesita vincular en ambas bibliotecas compartidas en el momento de la compilación (lo cual no queda claro a partir de su pregunta), puede usar -Bdirect
para la biblioteca compartida. Esto registrará todos los símbolos de la biblioteca compartida donde se encontraron; si en el tiempo de ejecución aparece una segunda definición del símbolo (de la otra biblioteca compartida), se ignorará.
Una solución es establecer la variable de entorno LD_PRELOAD
en la biblioteca cuyos símbolos deben tener prioridad. (Si esa biblioteca ha compartido sus propias dependencias de biblioteca, es posible que deba precargar todas sus dependencias, simplemente configure LD_PRELOAD
en la lista de bibliotecas dependientes, separadas por espacios).