linux dlopen: pode uma biblioteca ser “notificado” quando é carregado?
-
05-07-2019 - |
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?)
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.