2016-07-20 10 views
2

ich eine gemeinsame Bibliothek Autor, dass ‚dlopens‘ eine andere gemeinsam genutzte Bibliothek (von denen ich bin nicht der Autor/Inhaber)Wie löst eine DLL-Bibliothek ihre undefinierten Symbole auf?

My Shared Library wird durch eine ausführbare ‚dlopened‘ (von denen ich bin nicht der Autor/Besitzer)

So ist die Hierarchie: exe dlopen ist meine Bibliothek, meine Bibliothek dlopen ist eine andere Bibliothek.

Die Bibliothek, die meine Bibliothek dlopens verwendet, verwendet openssl. Es scheint jedoch, dass die Autoren dieser Bibliothek die openssl-Bibliotheken nicht verknüpfen - vielleicht unter der Annahme, dass der Benutzer der Bibliothek dies tun wird.

Wenn ich also versuche, ihre Bibliothek zu öffnen, stößt ich auf undefinierte Symbolfehler.

Auch wenn ich die OpenSSL-Bibliotheken in meine Bibliothek einbinden, bekomme ich immer noch die undefinierten Symbolfehler.

Meine Fragen sind zwei:

1) Wenn die Bibliothek erfordert openssl dlopen'ed ist, es weiß nur zu ‚Look‘ auf die exe das Symbol Auflösung zu tun?

2) Gibt es spezielle Linker-Flags, die ich in meiner Bibliothek vermisse, die in openssl verlinken, die ich brauche?

danke.

+0

Vielleicht kann das System die SSL-Bibliotheken nicht finden, sind sie an einem Standardstandort? Sie könnten versuchen, 'LD_LIBRARY_PATH' auf die 'SSL'-Bibliotheken zu setzen. – Galik

Antwort

0

Das Problem ist wirklich mit der gemeinsam genutzten Bibliothek, die nicht definierte Symbole hat. Dies kann zum Funktionieren gebracht werden, ist aber nicht portierbar und kann beim Wechsel von Linkern (z. B. Gold vs. Plain Id) unterbrochen werden.

Wenn sie das Symbol benötigen, müssen sie mit openssl verlinken. Wenn sie unabhängig von der Bibliothek sein wollen (vielleicht dynamisch über ABI-kompatible openssl-Forks wechseln - nur eine wilde Annahme, wohlgemerkt), sollten sie selbst auf die openssl-Implementierung über dlopen zugreifen und die Symbole manuell über dlsym auflösen. Unter der Annahme, dass der dynamische Linker die Symbole magisch "propagieren" wird.

Jetzt könnte es eine Möglichkeit geben, dies zu funktionieren.

Die "Verfügbarkeit" von Symbolen aus der dlopen'ed-Bibliothek wird gesteuert, wenn Sie dlopen, unter anderem über the RTLD_LOCAL/RTLD_GLOBAL flags.

Ergo, Sie könnten versuchen, openssl mit RTLD_GLOBAL zu öffnen, bevor Sie die Bibliothek öffnen, die openssl benötigt.

+0

Danke für die Rückmeldung. Ja - Wenn ich die OpenSSL-Bibliotheken öffne, bevor ich die Bibliothek öffne, die sie benötigt, funktioniert alles. Ich habe mich gefragt, ob es einen Weg gibt, das zu vermeiden, so wie es scheint. Vielen Dank. – user3472

+1

Es gibt einen Weg: den dynamischen Verknüpfungsprozess nicht absichtlich zu unterbrechen, so wie die Bibliothek, auf die Sie angewiesen sind. –

1

Wahrscheinlich funktioniert die Bibliothek, die auf OpenSSL beruht, dynamisch. Sie können die ldd command in der Bibliothek .so verwenden, um dies zu bestätigen. Wenn Sie dort keine Abhängigkeit von OpenSSL feststellen können, kann dies bedeuten, dass die Bibliothek manuell OpenSSL lädt (indem sie selbst dlopen aufruft). In diesem Fall können Sie nicht viel tun - kontaktieren Sie die Bibliotheksbetreuer für eine Reparatur.

Wenn die Abhängigkeit als Teil der Ausgabe ldd angezeigt wird, bedeutet dies, dass das Betriebssystem für das Laden zuständig ist. Die Regeln hierfür sind lang und kompliziert, aber die wichtigsten Dinge, die Sie wissen müssen, sind LD_LIBRARY_PATH und rpath.

Der erste ermöglicht dem Benutzer, eine systemweite Liste von Verzeichnissen anzugeben, in denen der Loader nach .so Dateien sucht, die geladen werden sollen. Letzteres ist eine Liste von Pfaden, die in die Bibliothek selbst eingebaut sind und vom Loader berücksichtigt werden.

Normalerweise wird von einem Bibliotheksverwalter erwartet, dass er seinen Rpath so einrichtet, dass die Bibliothek korrekt geladen wird, wenn alle Abhängigkeiten korrekt installiert sind. Schließlich ist es nicht sehr praktisch, sich darauf zu verlassen, dass der Benutzer seine LD_LIBRARY_PATH auf eine bestimmte Weise einstellt. Here's how you can inspect the .sos rpath.

Sie müssen also ein paar Dinge sicherstellen: Ob OpenSSL auf dem Rechner installiert ist, ob es die richtige Version ist und ob es an einem Ort ist, der vom Lader durchsucht werden kann. Dies kann ein wenig langweilig sein und es ist vielleicht nicht offensichtlich, am Ende, wer schuld ist, dass das Zeug nicht geladen wird, aber hoffentlich wird dies genug Informationen sein, um Ihnen zu helfen, eine Lösung zu finden.

+0

yep, es ist installiert und an einem Standardstandort -/usr/lib64. Danke für das Feedback – user3472