2013-02-22 17 views
7

Mam problem z biblioteką firm trzecich (np. TP.so) przy użyciu niepoprawnej wersji biblioteki (np. GenericV1.so) zamiast używać tej, która ma (na przykład GenericV2.so). Dodatkowa biblioteka jest dołączona do użytku w moim programie.Czy istnieje alternatywa dla flagi RTLD_DEEPBIND w funkcji dlopen() dla platform, które nie obsługują RTLD_DEEPBIND?

Prostym rozwiązaniem tego (dobrze udokumentowane na SO) jest użycie dlopen() z flagą RTLD_DEEPBIND. Ale flaga jest ważna tylko w systemie Linux, a nie na innych platformach, takich jak HP-UX, Solaris, AIX itp.

Czy istnieje alternatywa dla RTLD_DEEPBIND do użycia na tych platformach innych niż Linux?

Dzięki za odpowiedzi

+3

Myślę, że pytanie powinno brzmieć "Jak zastąpić RTLD_DEEPBIND w sposób kompatybilny z POSIX?" To spowoduje niezależną od platformy implementację twoich problemów. –

Odpowiedz

0

Wydaje mi się, że tak naprawdę nie potrzebują RTLD_DEEPBIND w ogóle. Musisz tylko upewnić się, że biblioteki z konkurującymi symbolami są ładowane we właściwej kolejności.

Kilka pomysłów:

  1. można użyć LD_PRELOAD aby upewnić się, że właściwą bibliotekę (GenericV2.so) jest załadowany przed innymi bibliotekami.

  2. Można utworzyć funkcję, która dlopens biblioteki w odpowiedniej kolejności: GenericV2.so, a następnie TP.so.

  3. Czy można upewnić się, że GenericV1.so nigdy nie jest załadowany? Czy potrzebujesz czegoś z tej biblioteki?

Powiązane problemy