2012-01-09 25 views
9

Ho caricato una libreria condivisa utilizzando dlopen (con le bandiere RTLD_NOW | RTLD_GLOBAL). Se questa libreria utilizza le funzioni dal programma principale, quindi non scarica. Quindi finisco con lo stesso codice per questa lib condivisa, anche se ho scaricato (usando dlclose), modificato, compilato, (ri) caricato.C++: dlclose non scarica la libreria condivisa

Il mio obiettivo è in realtà di ricaricare la stessa libreria dopo aver apportato delle modifiche, in modo da non dover riavviare l'intero programma per testare il mio codice.

Sto usando g ++ 4.2.3, su Linux Ubuntu 10.04.

(edit)

risolto:

"libreria caricata utilizza un simbolo a causa della RTLD_GLOBAL". In effetti, avevo dei simboli di un altro .a incorporato durante il collegamento che probabilmente venivano richiamati e impedivano alla mia libreria di chiudere ... Penso che sia possibile verificare che una lib scaricata usando dlopen (..., RTLD_NOLOAD) per controllare il la libreria è stata scaricata correttamente.

+0

Stai rilasciando l'handle per la tua DLL? – Felipe

+0

Probabilmente devi essere un po 'più specifico su quale piattaforma (Linux?) E quale versione stai usando. È probabile che sia importante per questo tipo di problema. –

+0

@Komyg: sto usando dlclose (handle), quindi presumo che l'handle venga rilasciato facendo così ... – Ben

risposta

4

La funzione dlclose() decrementa il conteggio dei riferimenti sull'handle della libreria dinamica. Se il conteggio dei riferimenti scende a zero e nessun'altra libreria caricata utilizza simboli al suo interno, la libreria dinamica viene scaricata.

Anche lo RTLD_NODELETE (su dlopen) rende dlclose non scaricare la libreria.

Dato che non è stato utilizzato RTLD_NODELETE, è più probabile che una libreria caricata utilizzi un simbolo a causa dello RTLD_GLOBAL.

+0

"la libreria caricata utilizza un simbolo a causa di RTLD_GLOBAL". infatti, avevo i simboli di un dominio .a incorporato durante il collegamento che probabilmente venivano richiamati e impedivano alla libreria di chiudersi ... Penso di poter verificare se una libreria scaricata usando dlopen (RTLD_NOLOAD) su di essa per verificare che la libreria sia stata sbloccata correttamente – Ben

Problemi correlati