2008-12-02 13 views
8

Ich habe zwei Bibliotheken von Drittanbietern, die gelegentlich den gleichen Symbolnamen exportiert haben. Wenn die ausführbare Datei geladen wird, wählt normalerweise ld die falsche aus und ich stürze als Ergebnis. Ich kann nicht viel über den Inhalt dieser Bibliotheken tun, so kann es eine Möglichkeit geben, ld wie man die richtige Implementation zu finden?Symbol (e) im freigegebenen Objekt von LD ausblenden

OS - Solaris 10, mein Programm ist von autoconf/autotools/gcc gebaut, widersprüchliche Bibliotheken sind libclntsh (Teil des Oracle-Treibers) und OpenLDAP. Leider kann ich die Implementierung des LDAP-Clients von Oracle nicht verwenden - es fehlen viele Funktionen, die OpenLDAP bietet.

Edited: Das Gestänge ist wie folgt: libclntsh.so-> A.so-> MAIN < -B.so < -libldap_r.so

+0

Hallo Dmitry. Sehen Sie sich [meine Frage] an (http://stackoverflow.com/questions/9909528/how-can-i-remove-a-symbol-from-a-shared-object). Anscheinend können Sie ['objcopy -N foo'] (http://linux.about.com/library/cmd/blcmdl1_objcopy.htm) verwenden, um die Symbole eines gemeinsamen Objekts zu löschen. –

Antwort

10

Wenn man sich nicht in beiden gemeinsam genutzten Bibliotheken verknüpfen müssen Kompilierzeit (was aus Ihrer Frage nicht klar ist), können Sie -Bdirect für die gemeinsame 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.

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 hat, müssen Sie möglicherweise alle Abhängigkeiten vorab laden. Setzen Sie einfach LD_PRELOAD in die Liste der abhängigen Bibliotheken, getrennt durch Leerzeichen.)

Verwandte Themen