linux dlopen: ¿puede una biblioteca ser & # 8220; notificada & # 8221; cuando se carga?

StackOverflow https://stackoverflow.com/questions/1602398

  •  05-07-2019
  •  | 
  •  

Pregunta

¿Hay alguna forma de que una biblioteca compartida sea notificada " " cuando se carga?

En otras palabras, digamos que uso dlopen en una biblioteca compartida, ¿existe una función que se llame automáticamente (si está presente) en la biblioteca compartida (por ejemplo, principal?)

¿Fue útil?

Solución

  

Las bibliotecas deberían exportar inicialización   y rutinas de limpieza usando el gcc   Atributos de la función __attribute __ ((constructor)) y __attribute __ ((destructor)). Ver las páginas de información de gcc para   información sobre estos. Constructor   Las rutinas se ejecutan antes de dlopen.   devuelve (o antes de que se inicie main ()   si la biblioteca está cargada en carga   hora). Las rutinas del destructor son   ejecutado antes de dlclose devuelve (o   después de la salida () o finalización de main ()   si la biblioteca está cargada en carga   hora). Los prototipos C para estos.   Las funciones son:

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

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

Eso es, simplemente agregas __attribute__ ((constructor)) a las funciones a las que quieres que te llamen cuando se carga la biblioteca compartida. El documento anterior también señala que las funciones más antiguas _ini y _fini se consideran obsoletas.

Otros consejos

Sí. Cuando se abre una biblioteca, toda la construcción estática tiene lugar ... así que, si usas C ++, puedes 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 __attribute__ ((constructor)) dadas, esto 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.

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top