Symbol (e) in Shared Object von LD ausblenden

8

Ich habe zwei Bibliotheken von Drittanbietern, die gelegentlich denselben Symbolnamen exportieren. Wenn die ausführbare Datei geladen wird, wählt ld normalerweise die falsche aus und ich stürze dadurch ab. Ich kann nicht viel über den Inhalt dieser Bibliotheken tun, also gibt es eine Möglichkeit, ld anzuweisen, wie man die richtige Implementation findet?

OS - Solaris 10, mein Programm wird von autoconf / autotools / gcc erstellt, in Konflikt stehende Bibliotheken sind libclnts (Teil des Oracle-Treibers) und OpenLDAP. Leider kann ich die Implementierung des LDAP-Clients von Oracle nicht verwenden - es fehlen viele Funktionen, die OpenLDAP hat.

Bearbeitet: Die Verknüpfung ist wie folgt: libclntsh.so- & gt; A.so- & gt; MAIN & lt; -B.so & lt; -libldap_r.so

    
Dmitry Khalatov 02.12.2008, 19:19
quelle

2 Antworten

10

Wenn Sie zur Kompilierungszeit nicht in beiden gemeinsam genutzten Bibliotheken verlinken müssen (was aus Ihrer Frage nicht klar ist), können Sie -Bdirect für die gemeinsam genutzte Bibliothek verwenden. Dies wird für alle Symbole aus der gemeinsam genutzten Bibliothek aufzeichnen, wo sie gefunden wurden; Wenn dann zur Laufzeit eine zweite Definition des Symbols erscheint (von der anderen gemeinsam genutzten Bibliothek), wird es ignoriert.

    
Martin v. Löwis 02.12.2008, 19:39
quelle
4

Eine Lösung besteht darin, die Umgebungsvariable LD_PRELOAD auf die Bibliothek zu setzen, deren Symbole Vorrang haben sollen. (Wenn diese Bibliothek eigene Bibliotheksabhängigkeiten gemeinsam genutzt hat, müssen Sie möglicherweise alle Abhängigkeiten vorab laden. Setzen Sie einfach LD_PRELOAD auf die Liste der abhängigen Bibliotheken, getrennt durch Leerzeichen.)

    
Josh Kelley 02.12.2008 20:09
quelle