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

今天写个程序,自定义了一个函数
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模式下属性页-连接器-启用增量链接选择否。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值