2009-10-21 24 views

Respuesta

21

Las bibliotecas deben exportar inicialización y rutinas de limpieza utilizando el gcc __ __attribute ((constructor)) y __ __attribute ((destructor)) atribuye la función. Consulte las páginas de información de gcc para obtener información sobre . Las rutinas de Constructor se ejecutan antes de dlopen devoluciones (o antes de que se inicie main() si la biblioteca se carga en el momento de la carga ). Las rutinas de Destructor son ejecutadas antes de que dlclose regrese (o después de la salida() o finalización de main() si la biblioteca se carga en la carga time). Los prototipos C para estos funciones son:

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

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

Es decir, que acaba de añadir __attribute__ ((constructor)) a las funciones que desea ser llamado cuando la biblioteca compartida está cargado. El documento anterior también señala que las funciones antiguas _ini y _fini se consideran obsoletas.

+0

Muy útil ... ¡gracias! – jldupont

+1

Nota: altamente no portátil. – Noldorin

0

Al menos en Linux, y probablemente en al menos algunos otros sistemas Unix, si la biblioteca se abre dinámicamente, el enlazador dinámico llamará a una función global llamada _init, si existe.

+0

... ¿cuál es el prototipo de esta función _init? – jldupont

+3

@Jack: acaba de descubrir a través de http://tldp.org/HOWTO/Program-Library-HOWTO/miscellaneous.html#INIT-AND-CLEANUP que las funciones especiales _init y _fini están marcadas como OBSOLETA/PELIGROSO ... – jldupont

15

Sí. Cuando se abre una biblioteca, toda la construcción estática tiene lugar ... así que, si se utiliza C++, puede hacerlo:

 
// 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 diferencia de las soluciones dadas __attribute__ ((constructor)), esto va a ser portátil. Tenga en cuenta, sin embargo, que si tiene varios objetos como este, no hay garantía con respecto a la orden de construcción/destrucción.

+0

Interesante ... ¡gracias! – jldupont

+0

Funciona como un encanto: gracias de nuevo. – jldupont

+0

Lástima que su respuesta llegó más tarde ... – jldupont

Cuestiones relacionadas