请教~VS2005函数名的问题

来源:百度知道 编辑:UC知道 时间:2024/05/25 02:47:32
vs2005中的函数名
不指向函数的首地址
而是指向一个jmp ***(跳向该函数)
是不是可以通过设置工程属性
使函数名直接指向函数的首地址

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