2008-12-02 8 views
8

Tengo dos bibliotecas de terceros que ocasionalmente tienen el mismo nombre de símbolo exportado. Cuando se carga el ejecutable, ld suele elegir el incorrecto y como resultado me cuelgo. No puedo hacer demasiado acerca del contenido de estas bibliotecas, por lo que puede haber una forma de ordenar ld cómo encontrar la imlementación adecuada?Ocultar símbolo (s) en objeto compartido de LD

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-> PRINCIPAL < -B.so < -libldap_r.so

+0

Hola Dmitry. Mira [mi pregunta] (http://stackoverflow.com/questions/9909528/how-can-i-remove-a-symbol-from-a-shared-object). Aparentemente, puede usar ['objcopy -N foo'] (http://linux.about.com/library/cmd/blcmdl1_objcopy.htm) para eliminar los símbolos de un objeto compartido. –

Respuesta

10

Si no es necesario enlazar en ambas bibliotecas compartidas en tiempo de compilación (que no está 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á.

4

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).

Cuestiones relacionadas