2009-10-21 8 views
12

Gibt es eine Möglichkeit, dass eine gemeinsam genutzte Bibliothek beim Laden "benachrichtigt" wird?linux dlopen: Kann eine Bibliothek beim Laden "benachrichtigt" werden?

Mit anderen Worten, sagen wir, ich dlopen auf einer gemeinsam genutzten Bibliothek verwenden, gibt es eine Funktion, die automatisch (falls vorhanden) auf der gemeinsam genutzten Bibliothek aufgerufen wird (zB Haupt?)

Antwort

21

Bibliotheken Initialisierung und Bereinigungsroutinen unter Verwendung des gcc __attribute __ ((Konstruktor)) und __attribute __ ((destructor)) Funktionsattribute exportieren sollten. Informationen dazu finden Sie auf den GCC-Infoseiten unter . Konstruktor Routinen werden ausgeführt, bevor dlopen zurückgibt (oder bevor main() gestartet wird, wenn die Bibliothek bei Laden geladen wird Zeit). Destruktor-Routinen werden ausgeführt, bevor dclclose zurückkehrt (oder nach dem Beenden() oder Abschluss von main() , wenn die Bibliothek bei Laden geladen wird Zeit). Die C-Prototypen für diese Funktionen sind:

void __attribute__ ((constructor)) my_init(void); 
void __attribute__ ((destructor)) my_fini(void); 

Entnommen http://tldp.org/HOWTO/Program-Library-HOWTO/index.html

Dies bedeutet, dass Sie nur auf __attribute__ Tack ((Konstruktor)) zu den Funktionen, die Sie angerufen werden soll, wenn die gemeinsam genutzte Bibliothek ist geladen. Das obige Dokument merkt auch an, dass die älteren Funktionen _ini und _fini als veraltet gelten.

+0

markiert sind Am hilfreichsten ... Danke! – jldupont

+1

Hinweis: stark nicht tragbar. – Noldorin

0

Mindestens auf Linux, und wahrscheinlich auf mindestens einigen anderen Unix-Systemen, wenn die Bibliothek dynamisch geöffnet wird, wird eine globale Funktion mit dem Namen _init, falls sie existiert, vom dynamischen Linker aufgerufen.

+0

... Was ist der Prototyp für diese _init-Funktion? – jldupont

+3

@Jack: habe gerade über http://tldp.org/HOWTO/Program-Library-HOWTO/miscellaneous.html#INIT-AND-CLEANUP herausgefunden, dass die _init und _fini Sonderfunktionen als OBSOLETE/DANGEROUS ... – jldupont

15

Ja. Wenn eine Bibliothek geöffnet wird, werden alle statischen Konstruktion erfolgt ... so, wenn Sie C++ verwenden, können Sie tun:

 
// mylibrary.cpp 
namespace 
{ 
    class dynamic_library_load_unload_handler 
    { 
     public: 
       dynamic_library_load_unload_handler(){ 
        // Code to execute when the library is loaded 
       } 
       ~dynamic_library_load_unload_handler(){ 
        // Code to execute when the library is unloaded 
       } 
    } dynamic_library_load_unload_handler_hook; 
} 

Im Gegensatz zu den __attribute__ ((constructor)) Lösungen gegeben, wird dies tragbar sein. Beachten Sie jedoch, dass, wenn Sie mehrere Objekte wie dieses haben, keine Garantie in Bezug auf die Konstruktions-/Zerstörungsreihenfolge besteht.

+0

Interessant ... danke! – jldupont

+0

Funktioniert wie ein Zauber: Nochmals vielen Dank. – jldupont

+0

Schade, dass deine Antwort später kam ... – jldupont