Mam wspólną bibliotekę linuksową, foo.so, która jest ładowana z pliku wykonywalnego przy użyciu dlopen("foo.so", RTLD_NOW | RTLD_LOCAL)
. Z foo.so chciałbym pobrać inną bibliotekę, bar.so, która odwołuje się do symboli zdefiniowanych w foo.so, ale linker nie znajduje ich. Nie mogę zmienić RTLD_LOCAL na RTLD_GLOBAL, ponieważ nie mam źródła do pliku wykonywalnego wykonującego ładowanie. Pomyślałem, że -Wl,--export-dynamic
podczas łączenia foo.so może pomóc, ale nie zastąpi lokalnej flagi do dlopen. Nowa funkcja widoczności atrybutów GCC nie wygląda tak, jakby oferowała odpowiedź.dlopen z dwoma udostępnionymi bibliotekami, eksportującymi symbole
Czy istnieje sposób, w jaki mogę polecić linkerowi, aby rozwiązał odwołania do niezdefiniowanych symboli w pasku.do tych definicji w foo.so, bez paska łączącego z -lfoo lub podobieństwem przenoszącym symbole do trzeciej biblioteki i łączącym oba foo i przeciwko niemu? Jedyne, co mi się zdarza, to dlopen foo.so z RTLD_GLOBAL z samego foo.so, a następnie dlopen bar.so, ale to uderza mnie jako trochę bałaganu. Dzięki.
Dzięki za odpowiedź. Nie mogę połączyć foo.so z bar.so, ponieważ bar.so będzie wtyczką dostarczoną przez użytkownika. Nie mogę też załatać pliku wykonywalnego, ponieważ zazwyczaj jest on własnością root-a w systemie klienta i nie jestem pewien, czy łatanie go zbytnio by się do nich zbliżyło, to komplikuje proces instalacji. Przełamałoby to również inne biblioteki uruchamiane przez exec, niektóre z nich polegają na RTLD_LOCAL. Myślę, że będę musiał pójść z dlopen foo.so z samego siebie, który wydaje się działać. Twoje zdrowie –