Sopra risposta è di gran lunga troppo complicata. Se il riferimento alla funzione è statico, in quanto è al di sopra , l'indirizzo è semplicemente il valore del nome del simbolo in un contesto puntatore:
void* myfunction_address = myfunction;
Se si sta afferrando la funzione in modo dinamico da una libreria condivisa, allora il valore restituito da dlsym() (POSIX) o G etProcAddress() (windows) è anche l'indirizzo della funzione.
Si noti che il codice sopra può generare un avviso con alcuni compilatori, in quanto ISO C impedisce tecnicamente l'assegnazione tra codice e puntatori di dati (alcune architetture li mettono in spazi di indirizzi fisicamente distinti).
E alcuni pedanti si sottolineano che l'indirizzo restituito non è davvero garantito per essere l'indirizzo di memoria della funzione, è solo un valore unico che può essere paragonato per l'uguaglianza con gli altri puntatori a funzione e gli atti, quando viene chiamato , per trasferire il controllo alla funzione di cui tiene il puntatore. Ovviamente tutti i compilatori conosciuti lo implementano con un indirizzo di destinazione del ramo.
Infine, notare che "l'indirizzo" di una funzione è un po 'ambiguo. Se la funzione è stata caricata dinamicamente o è un riferimento esterno a un simbolo esportato, ciò che ottieni è generalmente un puntatore a qualche codice di correzione nel "PLT" (un termine Unix/ELF, sebbene il meccanismo PE/COFF su Windows sia simile) che poi salta alla funzione.
fonte
2009-07-01 16:47:46
Stai chiedendo di un disassemblatore di runtime incorporato nel tuo programma? –
Cosa vuoi veramente? –
Grazie a tutti. Ho una buona comprensione di questo argomento: D – wakandan