在Visual Studio 2008(C++)中调试一些代码时,我注意到函数指针变量中的地址并不是函数本身的实际地址。这是一个extern "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文件中有一个包含每个方法的完整跳转表。
有人可以详细说明一下它为什么要这样做吗?这是一种调试“特性”吗?
print
的地址是0x013C4F10
?从反汇编来看,print
的地址似乎确实是0x013C1429
,这就是存储在printaddr
中的值。 - Martin