2012-01-09 10 views
9

Mam wspólną bibliotekę załadowaną przy użyciu dlopen (z flagami RTLD_NOW | RTLD_GLOBAL). Jeśli biblioteka korzysta z funkcji z programu głównego, nie rozładowuje się. Kończę więc z tym samym kodem dla tej współużytkowanej biblioteki, nawet jeśli rozładowałem (używając dlclose), zmieniono, skompilowałem, (ponownie) załadowałem.C++: dlclose nie rozładowuje biblioteki wspólnej

Moim celem jest przeładowanie tej samej biblioteki po wprowadzeniu w niej zmian, więc nie muszę ponownie uruchamiać całego programu, aby przetestować mój kod.

Używam g ++ 4.2.3, na Linux Ubuntu 10.04.

(red)

rozwiązany:

"załadowane biblioteki wykorzystuje symbol powodu RTLD_GLOBAL". Rzeczywiście, miałem symbole innego .a osadzone podczas łączenia, które zostały prawdopodobnie wywołane i uniemożliwiające zamknięcie mojej biblioteki ... Myślę, że można sprawdzić, czy lib jest rozładowywany za pomocą dlopen (..., RTLD_NOLOAD), aby sprawdzić biblioteka została poprawnie usunięta.

+0

Czy zwalniasz uchwyt do biblioteki dll? – Felipe

+0

Prawdopodobnie musisz być nieco bardziej konkretny na temat platformy (Linux?) I wersji, której używasz. To może mieć znaczenie dla tego rodzaju problemu. –

+0

@Komyg: Używam dlclose (uchwyt), więc przypuszczam, że uchwyt jest zwolniony robiąc tak ... – Ben

Odpowiedz

4

Funkcja dlclose() powoduje zmniejszenie liczby odwołań w uchwycie biblioteki dynamicznej. Jeśli licznik odniesień spadnie do zera, a żadne inne załadowane biblioteki nie użyją w nim symboli, to biblioteka dynamiczna jest rozładowywana.

Również RTLD_NODELETE (po dlopen) powoduje, że dlclose nie rozładowuje biblioteki.

Ponieważ nie używasz RTLD_NODELETE, najprawdopodobniej jest to, że załadowana biblioteka używa symbolu ze względu na RTLD_GLOBAL.

+0

"załadowana biblioteka używa symbolu z powodu RTLD_GLOBAL". rzeczywiście, miałem symbole z .a osadzone podczas łączenia, które prawdopodobnie zostały wywołane i uniemożliwiające zamknięcie biblioteki ... Myślę, że mogę sprawdzić, czy lib jest rozładowywany za pomocą dlopen (RTLD_NOLOAD), aby sprawdzić, czy biblioteka poprawnie się wypięła – Ben

Powiązane problemy