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.sound libsome2.so.
- Eine Anwendung ist mit verknüpft libsome1.so.
- Diese Anwendung libdl.solädt beispielsweise dynamisch ein anderes Modul libmagic.so.
- Jetzt libmagic.soist dagegen verlinkt libsome2.so. Ohne Verwendung von Linker-Skripten zum Ausblenden von Symbolen libmagic.sowerden zur Laufzeit alle Aufrufe von Interfaces in libsome2.soaufgelö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.soein Linker-Skript zu kompilieren und zu verknüpfen, das alle Symbole mit Ausnahme von 3 verbirgt, die darin definiert libmagic.sosind und von diesem exportiert werden. Das funktioniert ... oder zumindest libVersion()und LIB_VERSIONWerte 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.soeinen 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.soerstellen, damit alle Symbole gleich sind symbol@@VER_2(worüber ich immer noch verwirrt bin, weil der Befehl nm -CD libsome2.soimmer noch Symbole als symbolund nicht auflistet symbol@@VER_2) ... Nichts scheint zu funktionieren !!! Hilfe!!!!!!
RTLD_LOCALund RTLD_DEEPBINDdlopen Flags in Ihrer App. Ich habe jetzt keine Zeit, dies zu testen, aber es sollte basierend auf der Manpage funktionieren.