Nascondi i simboli nell'oggetto condiviso da LD
-
22-07-2019 - |
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
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.)