2009-10-21 10 views

Odpowiedz

21

Biblioteki powinny eksportować inicjalizacji i procedur czyszczenia za pomocą gcc __attribute __ ((konstruktor)) i __attribute __ ((destruktor)) funkcja atrybutów. Zobacz strony z informacjami o gcc pod adresem . Procedury Constructor są wykonywane przed zwróceniem dlopen (lub przed uruchomieniem funkcji main() , jeśli biblioteka jest załadowana pod obciążeniem ). Procedury niszczenia są wykonywane przed zwróceniem dlclose (lub po zakończeniu() lub zakończeniu głównej() , jeśli biblioteka jest załadowana pod obciążeniem czasu). Prototypy C dla tych funkcjami są:

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

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

czyli po prostu dołączać __attribute__ ((konstruktor)) z funkcjami, które mają zostać wywołana, gdy wspólna biblioteka jest załadowana. Powyższy dokument stwierdza również, że starsze funkcje _ini i _fini są uważane za przestarzałe.

+0

Najbardziej pomocne ... dzięki! – jldupont

+1

Uwaga: wysoce nieprzenośny. – Noldorin

0

Przynajmniej na Linuksie, i prawdopodobnie na co najmniej kilku innych systemach uniksowych, jeśli biblioteka jest dynamicznie otwierana globalna funkcja o nazwie _init, jeśli istnieje, zostanie wywołana przez dynamiczny linker.

+0

... jaki jest prototyp tej funkcji _init? – jldupont

+3

@Jack: właśnie dowiedziałem się przez http://tldp.org/HOWTO/Program-Library-HOWTO/miscellaneous.html#INIT-AND-CLEANUP, że funkcje specjalne _init i _fini są oznaczone jako OBSOLETE/DANGEROUS ... – jldupont

15

Tak. Gdy biblioteka jest otwarta, wszystko statyczna budowa odbywa ... więc, jeśli używasz C++, można zrobić:

 
// 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; 
} 

przeciwieństwie do __attribute__ ((constructor)) rozwiązań podanych, będzie to przenośny. Pamiętaj jednak, że jeśli masz wiele takich obiektów, nie ma gwarancji w odniesieniu do zlecenia budowy/zniszczenia.

+0

Interesujące ... dzięki! – jldupont

+0

Działa jak czar: jeszcze raz dziękuję. – jldupont

+0

Szkoda, że ​​odpowiedź pojawiła się później ... – jldupont

Powiązane problemy