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

Отлаживая некоторый код в Visual Studio 2008 (C++), я заметил, что адрес в моей переменной указателя функции не является исполнительным адресом самой функции. Это - экстерн "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) 

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

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

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

Кто-то может рассуждать, почему это делает это? Действительно ли это - отладка "функция"?

22
задан codenheim 21 March 2010 в 01:26
поделиться

3 ответа

Это вызвано 'Incremental Linking'. Если вы отключите эту функцию в настройках компилятора/линкера, то прыжки исчезнут.

http://msdn.microsoft.com/en-us/library/4khtbfyf(VS.80).aspx

20
ответ дан 29 November 2019 в 05:24
поделиться

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

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

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

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

2
ответ дан 29 November 2019 в 05:24
поделиться

Рискну предположить, но, возможно, нужно включить Edit-and-Continue .

Допустим, вам нужно перекомпилировать эту функцию, вам нужно изменить только таблицу косвенного обращения, а не всех вызывающих. Это резко сократит объем работы, которую необходимо выполнить при использовании функции «Изменить и продолжить».

6
ответ дан 29 November 2019 в 05:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: