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

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top