2009-10-21 14 views

risposta

21

biblioteche dovrebbero esportare inizializzazione e le routine di pulizia che utilizzano il gcc __attribute __ ((constructor)) ed __attribute __ ((destructor)) attribuisce la funzione. Vedere le pagine di informazioni di gcc per informazioni su . Le routine del costruttore vengono eseguite prima dei ritorni di dlopen (o prima che main() venga avviato se la libreria viene caricata al momento di caricamento ). Le routine del distruttore sono eseguite prima di dlclose restituisce (o dopo exit() o il completamento di main() se la libreria viene caricata al momento di caricamento ). I prototipi C per queste funzioni sono:

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

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

Cioè, basta virare su __attribute__ ((constructor)) per le funzioni che si desidera essere chiamato quando la libreria condivisa è caricato Il documento precedente nota anche che le vecchie funzioni _ini e _fini sono considerate obsolete.

+0

Molto utile ... grazie! – jldupont

+1

Nota: altamente non portatile. – Noldorin

0

Almeno su Linux, e probabilmente su almeno altri sistemi Unix, se la libreria viene aperta dinamicamente una funzione globale denominata _init, se esiste, verrà chiamata dal linker dinamico.

+0

... qual è il prototipo di questa funzione _init? – jldupont

+3

@Jack: appena scoperto tramite http://tldp.org/HOWTO/Program-Library-HOWTO/miscellaneous.html#INIT-AND-CLEANUP che le funzioni speciali _init e _fini sono contrassegnate come OBSOLETE/DANGEROUS ... – jldupont

15

Sì. Quando una libreria è aperta, tutta la costruzione statica avviene ... quindi, se si utilizza C++, si può fare:

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

A differenza delle soluzioni date __attribute__ ((constructor)), questo sarà portabile. Si noti, tuttavia, che se si dispone di più oggetti come questo, non vi è alcuna garanzia in merito all'ordine di costruzione/distruzione.

+0

Interessante ... grazie! – jldupont

+0

Funziona come un incantesimo: grazie ancora. – jldupont

+0

Peccato che la tua risposta sia arrivata più tardi ... – jldupont

Problemi correlati