Shim eine Bibliothek mit versionierten Symbolen

444
BuddyJohn

Wie erlaube ich für eine Bibliothek, die von einem gemeinsam genutzten Objekt geladen wird, dass versionierte Symbole von der ausführbaren Datei aufgelöst werden?

Es gibt eine proprietäre Bibliothek, die von vielen ausführbaren Dateien auf einem System verwendet wird und in einer Routine einen Fehler aufweist, den wir für das gesamte System patchen müssen. Dies macht etwas wie LD_PRELOAD umständlich und unpraktisch, um in jede Umgebung zwingen zu können, aus der diese ausführbaren Dateien gestartet werden könnten. Der Plan, der mir gegeben wurde, bestand darin, say libspecial.soin libspecial.so.orgeine neue Bibliothek zu kopieren und eine neue Bibliothek mit dem Namen zu erstellen, libspecial.sodie diese Funktion überschreibt und mit dieser verknüpft ist libspecial.so.org, damit alle übrigen Symbole automatisch geladen werden können.

In einem kleinen Test mit einer kleinen Beispielbibliothek hat dies gut funktioniert.
Die eine Funktion wird überschrieben, und alle anderen Symbole in der Originalbibliothek sind für die ausführbare Hauptdatei transparent verfügbar.

Die betreffende Bibliothek enthält jedoch einige versionierte Symbole. Aus irgendeinem Grund werden diese Informationen nicht weitergeleitet, und die ausführbare Datei beschwert sich (auch der Laufzeit-Linker), dass die benötigten Versionsinformationen nicht gesucht werden können.

Wie kann ich zulassen, dass versionierte Symbole von der ausführbaren Datei aufgelöst werden?
Wenn ich die Bibliothek explizit mit dlopen lade, gibt es vielleicht spezielle Flags, die dies erlauben?
Oder gibt es einen einfacheren Weg?

Ein Kollege schlug vor, dass wir alle ausführbaren Informationen aus den ausführbaren ELF-Strukturen entfernen könnten, was wir ausprobiert haben und es funktioniert. Aber dann muss ich alle ausführbaren Dateien ändern, und es gibt auch die Sorge, dass dies etwas kaputt machen könnte und sich zu riskant anfühlt. Da der Laufzeit-Linker mit dem Auflösen der Symbole umgehen kann und gerade durch die Versionsinformationen gebremst wird, vermisse ich nur, dass mir eine Möglichkeit fehlt, dieses Problem in der Bibliothek leicht zu handhaben.

1
Ich wusste nicht, dlmopen (). Zusammen mit LM_ID_BASE klingt das genau so, wie ich es will. Das funktioniert aber auch nicht. Ich verstehe nicht warum. Ich habe das Gefühl, dass es eine größere Lektion über die Details der Laufzeitverknüpfung gibt, die ich hier lernen muss. BuddyJohn vor 8 Jahren 0

0 Antworten auf die Frage