在 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 中的每个方法都有一个完整的跳转表。
有人可以解释一下为什么这样做吗?它是一个调试“功能”吗?
这是由“增量链接”引起的。如果您在编译器/链接器设置中禁用它,跳转将会消失。
http://msdn.microsoft.com/en-us/library/4khtbfyf(VS.80).aspx http://msdn.microsoft.com/en-us/library/4khtbfyf(VS.80).aspx
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)