errore di asserzione _dl_close
Domanda
sto utilizzando dlopen () in un modulo di Apache che sto scrivendo in modo che io possa avere un sistema di plugin per il mio modulo. Ho scoperto che se io compilo il mio modulo, compilo il mio plug-in, e avviare Apache, tutto funziona peachy-keen.
Se, invece, dopo aver fatto tutto questo, ho ricompilare il mio plug-in, (facendo una piccola modifica o due per il codice plugin,) il mio prossimo caricamento della pagina causerà Apache per segmentation fault. Ogni richiesta successiva funziona bene, ancora una volta. Così, è solo il primo caricamento della pagina subito dopo la compilazione che fa sì che il segfault.
Ho cercato di affrontare questo per un paio di giorni (io non sono grande a C il debug) e oggi, ho notato nei miei log di errore apache:
Inconsistency detected by ld.so: dl-close.c: 719: _dl_close: Assertion `map->l_init_called' failed!
Qualcuno ha idea di cosa sta succedendo? Questo significa che non è il mio codice e che sono stato a caccia di un bug fantasma? Sono abbastanza fiducioso che dlcose () che io chiamo per ogni chiamata a dlopen (). Tuttavia, questo particolare bug / segfault sembra accadere quando si esegue apache in modalità single-process e iniziare ad aggiornare la pagina in fretta.
Soluzione
Alcune idee:
-
Probabilmente si chiama
dlopen()
più di una volta?dl
biblioteca gestisce i contatori di riferimento che viene incrementato ad ogni mododlclose()
RTLD_NODELETE
scaricherà le libreria solo se il contatore == 0. -
È stato specificato
strace
bandiera perstrace -p<pid>
(supponendo che si sono su Linux)? Se sì, <=> non scaricare la libreria.
Hai provato a chiamate di sistema di debug con <=>? Avviare Apache, trova il suo pid e tracciare tutte le chiamate di sistema Apache doesn chiamando <=>. Probabilmente vi darà qualche idea di cosa sta succedendo.