您的位置:首页 > 其它

关于VS2008debug编译下函数名字就是函数地址的问题

2011-11-16 19:34 281 查看
今天写个程序,自定义了一个函数

void Func();

然后

DWORD dwStart=(DWORD)Func;

调试监视 dwStart与Func两值不同

拿到OD里看了下发现是这样的

0062D7D3 . /E9 68050100 JMP demo.0063DD40

原来debug版本的地址都是

A:jmp B

B:Func()。

dwStart得到的地址是A,Func得到的是B

所以会不一样。

因为VC中会生成一个函数的符号以及函数实际地址对应的表,当调用1个函数时,先得到的是函数的符号地址,而这些符号地址里面都是对应1个跳转指令,指向函数的实际地址。如果去掉程序的incremental link选项,就是跳到直接的函数地址,而没有中间的jmp了。

Link incrementally允许连结函式时多留一些额外的空间。这个空间只是函数式之间的余隙,并不影响程序的运行,但会使程序体积变大不少。这样做的好处是:当连结完成后,连结器会把函数式连结的相关信息储存到数据库。当程序员修改某个函式,只要该函式增加的程序不超过保留的额外的空间,当程序再编译连结时便不需要对其它的函式重新relocate
address,这样会使连结的速度加快很多。这用在更改程序频繁的debug时期当然是很好的功能,但当程序 release时就不需要这些多余的空间了。所以一般会在debug mode 时enable Link incrementally,release时则disable它。简单的说增量链接是编译器为了减少链接时间做的处理,把函数体用一个JMP指令代替,这样就可以随意改变函数的内容,而不用修改CALL指令。

要关闭就在debug模式下属性页-连接器-启用增量链接选择否。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐