Ich versuche, mehr über die Bibliotheksversionierung unter Linux zu erfahren und zu erfahren, wie alles funktioniert. Hier ist der Kontext:
- Ich habe zwei Versionen einer dynamischen Bibliothek, die denselben Satz von Schnittstellen verfügbar machen, sagen wir libsome1.so
und libsome2.so
.
- Eine Anwendung ist mit verknüpft libsome1.so
.
- Diese Anwendung libdl.so
lädt beispielsweise dynamisch ein anderes Modul libmagic.so
.
- Jetzt libmagic.so
ist dagegen verlinkt libsome2.so
. Ohne Verwendung von Linker-Skripten zum Ausblenden von Symbolen libmagic.so
werden zur Laufzeit alle Aufrufe von Interfaces in libsome2.so
aufgelöst libsome1.so
. Dies kann bestätigt werden, indem der von zurückgegebene Wert mit libVersion()
dem Wert des Makros verglichen wird LIB_VERSION
.
- Also versuche ich als nächstes, libmagic.so
ein Linker-Skript zu kompilieren und zu verknüpfen, das alle Symbole mit Ausnahme von 3 verbirgt, die darin definiert libmagic.so
sind und von diesem exportiert werden. Das funktioniert ... oder zumindest libVersion()
und LIB_VERSION
Werte stimmen überein (und es wird Version 2 und nicht 1 gemeldet).
- Als jedoch einige Datenstrukturen auf die Festplatte serialisiert wurden, bemerkte ich eine Beschädigung. Wenn ich im Verzeichnis der Anwendung libsome1.so
einen Softlink lösche und an seiner Stelle einen solchen erstelle libsome2.so
, funktioniert alles wie erwartet, und die gleiche Beschädigung tritt nicht auf.
Ich kann nicht anders, als zu glauben, dass dies auf einen Konflikt in der Symbolauflösung des Laufzeit-Linkers zurückzuführen ist. Ich habe viele Dinge ausprobiert, wie den Versuch, eine Verknüpfung zu libsome2.so
erstellen, damit alle Symbole gleich sind symbol@@VER_2
(worüber ich immer noch verwirrt bin, weil der Befehl nm -CD libsome2.so
immer noch Symbole als symbol
und nicht auflistet symbol@@VER_2
) ... Nichts scheint zu funktionieren !!! Hilfe!!!!!!
RTLD_LOCAL
und RTLD_DEEPBIND
dlopen Flags in Ihrer App. Ich habe jetzt keine Zeit, dies zu testen, aber es sollte basierend auf der Manpage funktionieren.