Depurando algún código en Visual Studio 2008 (C++), noté que la dirección en la variable de puntero a función no es la dirección real de la función. Esta es una función externa "C".La dirección de la función no es la dirección de código real
int main() {
void (*printaddr)(const char *) = &print; // debug shows printaddr == 0x013C1429
}
Address: 0x013C4F10
void print() {
...
}
El desmontaje de tomar la dirección de la función es:
void (*printaddr)(const char *) = &print;
013C7465 C7 45 BC 29 14 3C 01 mov dword ptr [printaddr],offset print (13C1429h)
EDIT: Vi el código en la dirección 013C4F10 y el compilador es aparentemente la inserción de una instrucción "JMP" en esa dirección.
013C4F10 E9 C7 3F 00 00 jmp print (013C1429h)
En realidad existe una tabla de salto completa de cada método en el .exe.
¿Alguien puede explicar por qué lo hace? ¿Es una "característica" de depuración?
Hmm, lo que está diciendo la dirección de '' print' es 0x013C4F10'? En cuanto al desmontaje, parece que la dirección de impresión es '0x013C1429' y ese es el valor que se almacena en' printaddr' – Martin
El desmontaje en Visual Studio muestra imprimir en la dirección 0x013C4F10 – codenheim
@Martin: Cuando cambio al modo de lanzamiento, la tabla de salto desaparece y la dirección es de hecho la dirección de la función real. – codenheim