2013-02-22 8 views
7

Ich habe das Problem, dass eine Bibliothek eines Drittanbieters (zB TP.so) eine falsche Bibliotheksversion verwendet (zB GenericV1.so), statt die zu verwenden, die es eigentlich sein soll (zB GenericV2.so). Die zusätzliche Bibliothek ist für die Verwendung in meinem Programm enthalten.Gibt es eine Alternative zum RTLD_DEEPBIND-Flag in der Funktion dlopen() für Plattformen, die RTLD_DEEPBIND nicht unterstützen?

Die einfache Lösung für diese (gut dokumentiert auf SO) ist die Verwendung von dlopen() mit RTLD_DEEPBIND Flag. Aber das Flag ist nur unter Linux, nicht auf anderen Plattformen wie HP-UX, Solaris, AIX usw. gültig.

Gibt es eine Alternative für RTLD_DEEPBIND für den Einsatz in diesen Nicht-Linux-Plattformen?

Vielen Dank für Ihre Antworten

+3

Ich denke, die Frage sollte lauten "Wie RTLD_DEEPBIND in einer POSIX-kompatiblen Weise ersetzen?" Dies führt zu einer plattformunabhängigen Umsetzung Ihrer Probleme. –

Antwort

0

Es scheint mir, dass Sie nicht wirklich RTLD_DEEPBIND überhaupt brauchen. Sie müssen nur sicherstellen, dass die Bibliotheken mit den konkurrierenden Symbolen in der richtigen Reihenfolge geladen werden.

Einige Ideen:

  1. Sie LD_PRELOAD nutzen könnten, um sich sicher, die richtige Bibliothek (GenericV2.so) vor allen anderen Bibliotheken geladen.

  2. Sie könnten eine Funktion erstellen, die die Bibliotheken in der richtigen Reihenfolge öffnet: GenericV2.so und dann TP.so.

  3. Kann sichergestellt werden, dass GenericV1.so niemals geladen wird? Brauchst du etwas aus dieser Bibliothek?