Las direcciones de funciones de c ++ que salen diferentes en la biblioteca de perfiles adjunta que en la base del código de asunto

He escrito un instrumento-er en C ++ para registrar las funciones de entrada y salida conectando las llamadas de entrada y salida. Funciona como se supone que debe hacerlo con una base de código heredada. Sin embargo, al conectarme con un proyecto que descargué de git, las direcciones de función que guardo en una variable externa en el código de asunto, salen diferentes en la biblioteca de perfiles. Eso está arruinando la comparación del puntero de función entre las funciones enganchadas y guardadas.

Dirección de la función en el archivo principal del código de asunto, el punto de interrupción está dentro de la función de enlace _penter en el código del perfilador actualmente

La misma entrada muestra una dirección diferente con un "_" antes del nombre de la función, en el código del generador de perfiles

No tengo idea de cómo está cambiando las direcciones y quiero saber si estoy haciendo algo mal.

La forma en que lo hago es que tengo una matriz externa de punteros de función (y sus nombres) que se inicializa con referencias de funciones de código de asunto en el archivo principal de asunto (donde todas las funciones están disponibles). En la función de enlace (_penter) de la biblioteca, obtengo la dirección de la función que acabo de ingresar. Entonces lo comparo con las direcciones en la matriz externa, y si coincide, registro la función ingresada.

SNIPPET FROM PROFILE.H (generador de perfiles)

extern Signature FuncTable[3000]; 

SNIPPET FROM PROFILE.CPP (generador de perfiles)

void _stdcall EnterFunc0(unsigned * pStack)
{
    void      * pCaller;
    pCaller = (void *)(pStack[0] - 5); // the instruction for calling _penter is 5 bytes long
    Signature * funct = FuncTable; //the table that has references to functions and their names
    funct = FuncTable;
    while (funct->function)
    {
        //const BYTE * func = (const BYTE *)funct->function;
        if ((void *)(pStack[0] - 5) == (void *)(funct->function))
        {
            int a = 0;
            linesBuffer = linesBuffer + "Entering " + funct->signature + ";";
            linesBuffer = linesBuffer + "\n";
            WriteToFile(false); //function buffers 100kb before writing
            break;
        }
        funct++;
    }
}
extern "C" __declspec(naked) void __cdecl _penter()
{
    _asm
    {
        pushad              // save all general purpose registers
            mov    eax, esp     // current stack pointer
            add    eax, 32      // stack pointer before pushad
            push   eax          // push pointer to return address as parameter to EnterFunc0

            call   EnterFunc0

            popad               // restore general purpose registers
            ret                 // start executing original function
    }
}

SNIPPET FROM main.c (archivo principal del código de asunto)

#include "../Profile/Profile.h"
Signature FuncTable[] = {
    { (int)TetrisView_ProcessPauseMenu, "TetrisView_ProcessPauseMenu" },
    { NULL }
};

Respuestas a la pregunta(1)

Su respuesta a la pregunta