2012-06-12 17 views
7

Ich habe Objekt A.o freigegeben, das statisch zu libssl.a verbindet & ein anderes gemeinsames Objekt B.so, das auch libssl.a statisch verknüpft.Statische Bibliothek zweimal geladen

A.so & B.so hat Symbole aus libssl.a im GLOBAL-Bereich. Ich überprüfte dies durch readelf -s A.so

Ich habe eine ausführbare Datei a.out, die A.so und B.so lädt. Wenn a.out beendet wurde, bekomme ich einen doppelten freien Fehler in einem der Symbole von libssl.a in A.so.

Obwohl libssl.a statisch mit jedem gemeinsam genutzten Objekt verknüpft ist, ist es möglich, dass das gleiche Symbol gemeinsam genutzt wird, anstatt es lokal zu kopieren.

Was ist die Problemumgehung das? Wie macht man die Symbole hier lokal?

Bitte helfen Sie

+0

Ich würde empfehlen, einen Debugger zu verwenden, um Ihre Theorie zu bestätigen. – jdigital

+0

Könnten Sie das ausarbeiten? – KodeWarrior

+0

Nur eine kleine Sache, weil ich keine Ahnung habe, wie man es auf deine Situation anwendet: 'dlopen' hat ein RTLD_LOCAL-Flag, das unter Umständen in genau dieser Situation helfen würde. Also, wenn Sie diese Bibliotheken mit 'dlopen' öffnen, sollten sie sich dann wahrscheinlich nicht einmischen. – liori

Antwort

5

Dies wird in der Tat erwartet. Eine Instanz von libssl.a interpagiert (wahrscheinlich eine Teilmenge) der anderen, und die Ergebnisse sind nicht hübsch. Sie können ein Versions-Skript (--version-script an ld, mit -Wl, für cc) verwenden, um zu steuern, was von A.so und B.so exportiert wird. Wenn etwas nicht exportiert wird, kann es auch nicht zwischengeschaltet werden.

Alternativ können Sie libssl.a mit Sichtbarkeitsflags wie -fvisibility=hidden kompilieren. Diese Flags betreffen nur den dynamischen Linker und nicht die statische Verknüpfung. Wahrscheinlich mussten Sie es trotzdem selbst kompilieren, da die mitgelieferten Dateien .a dazu neigen, positionsabhängigen Code zu enthalten, der für die Verknüpfung mit ausführbaren Dateien gedacht ist. Nur einige Plattformen wie 32-Bit x86 ermöglichen es Ihnen, solchen Code in gemeinsame Objekte zu integrieren und dies nur auf Kosten von Textverlagerungen.

Die dlopen mit RTLD_LOCAL wie in einem Kommentar vorgeschlagen sollte auch funktionieren, aber es scheint hackish dlopen für diesen Zweck zu verwenden.

Eine weitere Option ist die Verwendung der gleichen gemeinsamen libssl.so in beiden Bibliotheken.

Verwandte Themen