Ich habe eine gemeinsam genutzte Bibliothek geladen mit dlopen
(mit den Flags RTLD_NOW | RTLD_GLOBAL
).
Wenn diese Bibliothek Funktionen aus dem Hauptprogramm verwendet, wird sie nicht entladen. Also habe ich am Ende den gleichen Code für diese shared lib, auch wenn ich ihn entladen habe (mit dlclose
), geändert, kompiliert, (neu) geladen habe.
Mein Ziel ist es, dieselbe Bibliothek neu zu laden, nachdem ich Änderungen daran vorgenommen habe, damit ich nicht das gesamte Programm neu starten muss, um meinen Code zu testen.
Ich verwende g ++ 4.2.3, unter Linux Ubuntu 10.04.
(bearbeiten)
gelöst:
"geladene Bibliothek verwendet ein Symbol aufgrund der RTLD_GLOBAL". Tatsächlich hatte ich beim Verknüpfen Symbole von einem anderen .a eingebettet, die wahrscheinlich zurückgerufen wurden und verhinderten, dass meine Bibliothek schloss ... Ich denke, es ist möglich, zu überprüfen, dass eine lib, die mit dlopen (..., RTLD_NOLOAD) entladen wurde, um zu überprüfen, ob die Bibliothek korrekt entladen wurde.
Die Funktion dlclose()
dekrementiert die Referenzzählung für das Handle der dynamischen Bibliothek. Wenn der Referenzzähler auf Null fällt und keine anderen geladenen Bibliotheken Symbole verwenden, wird die dynamische Bibliothek entladen.
Auch die RTLD_NODELETE
(bei dlopen
) veranlasst dlclose
, die Bibliothek nicht zu entladen.
Da Sie RTLD_NODELETE
nicht verwendet haben, ist es am wahrscheinlichsten, dass eine geladene Bibliothek aufgrund der RTLD_GLOBAL
ein Symbol verwendet.