Por encima de respuesta es muy complicada demasiado. Si la referencia de funciones es estático, ya que está por encima , la dirección es simplemente el valor del nombre del símbolo en el contexto del puntero:
void* myfunction_address = myfunction;
Si está agarrando la función dinámica de una biblioteca compartida, entonces el valor devuelto por dlsym() (POSIX) o G etProcAddress() (windows) es también la dirección de la función.
Tenga en cuenta que es probable que el código anterior genere una advertencia con algunos compiladores, ya que ISO C prohíbe técnicamente la asignación entre códigos y punteros de datos (algunas arquitecturas los colocan en espacios de direcciones físicamente distintos).
Y algunos pedantes se señalan que la dirección devuelta no es realmente garantiza que sea la dirección de memoria de la función, es sólo un valor único que se puede comparar a la igualdad con otros punteros de función y actos, cuando se le llama , para transferir el control a la función cuyo puntero contiene. Obviamente, todos los compiladores conocidos implementan esto con una dirección de destino de sucursal.
Y, por último, tenga en cuenta que la "dirección" de una función es un poco ambigua. Si la función se cargó dinámicamente o es una referencia externa a un símbolo exportado, lo que realmente se obtiene es generalmente un puntero a algún código de corrección en el "PLT" (un término Unix/ELF, aunque el mecanismo PE/COFF en Windows es similar) que luego salta a la función.
¿Está preguntando acerca de un desensamblador en tiempo de ejecución integrado en su programa? –
¿Qué es lo que realmente quieres? –
Gracias a todos. Tengo una buena comprensión de este asunto: D – wakandan