Obtendo um ponteiro vazio via dlsym(), o objetivo é invocar a função referenciada por esse ponteiro. A tentativa de conversão por meio de conversão usando static_cast ou reinterpret_cast falhou, ao contrário de uma conversão no estilo C.
A conversão direta de um ponteiro nulo em um ponteiro de função não é permitida em C 98/03. No entanto, C 0x oferece suporte condicional, permitindo que uma implementação dite o comportamento.
Abordagem de comportamento indefinido:
Embora indefinido pelo padrão, o código a seguir pode funcionar em maioria das plataformas:
void *gptr = dlsym(some symbol..);
typedef void (*fptr)();
fptr my_fptr = reinterpret_cast(reinterpret_cast(gptr));
Alternativamente:
fptr my_ptr = 0;
reinterpret_cast(my_ptr) = gptr;
Abordagem complexa, mas portátil:
Este método explora o fato de que o endereço de um ponteiro de função é um ponteiro de objeto:
// Get address as object pointer
void (**object_ptr)() = &my_ptr;
// Convert to void** (also an object pointer)
void **ppv = reinterpret_cast(object_ptr);
// Store address from 'gptr' in memory cell pointed to by 'ppv'
*ppv = gptr;
Essa abordagem permanece indefinida no padrão, mas deve funcionar razoavelmente bem na maioria das implementações.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3