Подтвердить что ты не робот

Адрес функции не является фактическим адресом кода

Отладка какого-либо кода в Visual Studio 2008 (С++), я заметил, что адрес в моей переменной указателя функции не является фактическим адресом самой функции. Это внешняя функция "C".

int main() {
   void (*printaddr)(const char *) = &print; // debug shows printaddr == 0x013C1429

}

Address: 0x013C4F10
void print() {
  ...
}

Демонтаж адреса функции:

   void (*printaddr)(const char *) = &print;
013C7465 C7 45 BC 29 14 3C 01 mov         dword ptr [printaddr],offset print (13C1429h) 

EDIT: я просмотрел код по адресу 013C4F10, и компилятор, по-видимому, вставляет инструкцию "jmp" по этому адресу.

013C4F10 E9 C7 3F 00 00   jmp         print (013C1429h) 

На самом деле существует целая таблица переходов каждого метода в .exe.

Может кто-нибудь изложить, почему он это делает? Это отладочная "функция"?

4b9b3361

Ответ 2

Я собираюсь рискнуть здесь, но возможно включить Изменить и продолжить.

Предположим, вам нужно перекомпилировать эту функцию, вам нужно только изменить таблицу ориентации, а не все вызывающие. Это значительно сократит объем работы, которая будет выполняться, когда будет выполняться функция "Редактировать и продолжить".

Ответ 3

Компилятор вставляет инструкцию "jmp" по этому адресу в реальный метод.

013C4F10 E9 C7 3F 00 00   jmp         print (013C1429h)

На самом деле существует целая таблица переходов каждого метода в .exe.

Это функция отладки. Когда я переключаюсь в режим освобождения, таблица перехода исчезает, и адрес действительно является фактическим адресом функции.

Ответ 4

возможно, это связано с взаимодействием между компоновщиком и необходимостью вызова кода в DLL

В этой статье рассказывается об этом, я не уверен на 100%, как это применимо к вашему примеру, но похоже, что это может помочь вам понять http://msdn.microsoft.com/en-us/library/aa271769(VS.60).aspx