Domanda

Occasionalmente ho due librerie di terze parti con lo stesso nome di simbolo esportato.Una volta caricato l'eseguibile, ld di solito scelgo quello sbagliato e di conseguenza ottengo un arresto anomalo.Non posso fare molto per il contenuto di queste librerie, quindi potrebbe esserci un modo per istruire ld come trovare la corretta implementazione?

Sistema operativo - Solaris 10, il mio programma è creato da autoconf/autotools/gcc, sono presenti librerie in conflitto libclntsh (parte del driver Oracle) e OpenLDAP.Sfortunatamente, non posso utilizzare l'implementazione Oracle del client LDAP: manca di molte funzionalità di OpenLDAP.

Modificato:Il collegamento è il seguente:libclntsh.so->A.so->MAIN<-B.so<-libldap_r.so

È stato utile?

Soluzione

Se non è necessario collegarsi in entrambe le librerie condivise al momento della compilazione (cosa non chiara dalla domanda), è possibile utilizzare -Bdirect per la libreria condivisa. Ciò registrerà per tutti i simboli della libreria condivisa in cui sono stati trovati; se poi in fase di esecuzione appare una seconda definizione del simbolo (dall'altra libreria condivisa), verrà ignorato.

Altri suggerimenti

Una soluzione è impostare il file LD_PRELOAD variabile d'ambiente alla libreria i cui simboli dovrebbero avere la precedenza.(Se quella libreria ha dipendenze di libreria condivise, potrebbe essere necessario precaricare tutte le sue dipendenze;basta impostare LD_PRELOAD all'elenco delle librerie dipendenti, separate da spazi.)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top