Pergunta

Existe uma maneira para uma biblioteca compartilhada a ser "notificado" quando é carregado?

Em outras palavras, digamos que eu use dlopen em uma biblioteca compartilhada, há uma função que é chamada automaticamente (se houver) na biblioteca compartilhada (por exemplo, principal?)

Foi útil?

Solução

As bibliotecas devem exportar inicialização e rotinas de limpeza utilizando o gcc __attribute __ ((construtor)) e __attribute __ ((destructor)) atributos de função. Veja as páginas de informação gcc para informações sobre estes. Construtor rotinas são executadas antes de dlopen retornos (ou antes de main () é iniciado Se a biblioteca é carregada com a carga Tempo). rotinas destructor são executado antes dlclose retornos (ou após a saída () e aperfeiçoamento das principal () Se a biblioteca é carregada com a carga Tempo). Os protótipos C para estes funções são:

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

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

Isto é, você só orçada em __attribute__ ((constructor)) para as funções que pretende ser chamada quando a biblioteca compartilhada é carregado. O docuemtn acima também observa que as funções _INI e _fini mais velhos são considerados obsoletos.

Outras dicas

Sim. Quando uma biblioteca é aberta, toda a construção estática acontece ... então, se você usar C ++, você pode fazer:

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

Ao contrário das soluções __attribute__ ((constructor)) dada, esta será portátil. Note, porém, que se você tiver vários objetos como este, não há nenhuma garantia em relação à ordem de construção / destruição.

Pelo menos no Linux, e, provavelmente, pelo menos em alguns outros sistemas Unix, se a biblioteca é aberta dinamicamente um _init função global chamada, se existir, será chamado pelo vinculador dinâmico.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top