Obtener un puntero nulo a través de dlsym(), el objetivo es invocar la función a la que hace referencia ese puntero. El intento de conversión mediante conversión usando static_cast o reinterpret_cast ha fallado, a diferencia de una conversión estilo C.
La conversión directa de un puntero nulo a un puntero de función no está permitida en C 98/03. Sin embargo, C 0x ofrece soporte condicional, lo que permite que una implementación dicte el comportamiento.
Enfoque de comportamiento indefinido:
Si bien no está definido por el estándar, el siguiente código puede funcionar en la mayoría de las 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;
Enfoque complejo pero portátil:
Este método explota el hecho de que la dirección de un puntero de función es un puntero 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;
Este enfoque sigue sin estar definido en el estándar, pero debería funcionar razonablemente bien en la mayoría de las implementaciones.
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3