关于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模式下属性页-连接器-启用增量链接选择否。
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模式下属性页-连接器-启用增量链接选择否。
相关文章推荐
- Java值传递和地址传递:关于String类型和集合类型作为函数参数时传值问题的测试
- 关于PHP程序使用file_get_content()函数进行抓取PHP程序与smarty结合编译过程中产生的静态文件,抓取不了?连接超时?(地址映射)
- 关于将函数写入头文件问题(分离式编译)
- 作业疑点:关于Linux下数学函数math.h无法编译问题
- 关于PHP程序使用file_get_content()函数进行抓取PHP程序与smarty结合编译过程中产生的静态文件,抓取不了?连接超时?(地址映射)
- 关于PHP程序使用file_get_content()函数进行抓取PHP程序与smarty结合编译过程中产生的静态文件,抓取不了?连接超时?(地址映射)
- 编译 php 没问题 make 出问题 就是 缺少data 成员函数
- 关于QT中自动添加槽函数编译出错的问题
- 关于crypt函数编译的问题
- 关于PHP程序使用file_get_content()函数进行抓取PHP程序与smarty结合编译过程中产生的静态文件,抓取不了?连接超时?(地址映射)
- 关于指针作为函数参数传递的理解,对比普通变量作为函数参数的需注意点,其实就是行参和实参的问题。
- 关于keil编译cortex-m3纯汇编时为什么问题使用align地址问题
- C语言学习4: 函数返回值与传入参数,关于函数值传递和类型隐性转换,变量不同的作用域,static变量,多文件编译例如两个C文件,显示函数调用语句跳转,递归,斐波那契数列,多文件编译相同变量的问题。
- C 语言栈内存无法向父函数传递地址问题 [李园7舍_404]
- 关于powerbuilder的全局函数重载问题
- 遇到一个关于静态成员函数的问题
- 关于linux内核驱动开发中Makefile编译的问题
- 关于在Windows Server2003上面配置虚拟目录物理路径为局域网内其他机器地址的若干问题
- 关于编译时时钟错误的问题
- 关于“cvPyrSegmentation”找不到标识符和与之相关的编译失败的问题