`
huobengle
  • 浏览: 860994 次
文章分类
社区版块
存档分类
最新评论

关于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模式下属性页-连接器-启用增量链接选择否。

分享到:
评论

相关推荐

    vs2008编译ADB(Android Debug Bridge)

    用vs2008编译的adb,源代码取之android代码树,修正若干编译错误,修正若干不被vs2008所支持的接口函数,遗留至少一个bug,这个bug就是没有free一块分配的内存,有一点内存泄露,百思不得其解为什么free失败,有兴趣...

    TinyXML2.3.4 源码及VS2010编译后的静态库(debug和release)

    网络上下载的源码,有时用到了比较老的开源库,一般很难找到了。本资源是TinyXML2.3.4版本,加上了vs2010编译后的静态库,亲测有效。

    MinGW64编译好的可以用于Win7_VS平台下X64环境C++工程的ARPACK的dll&lib;库

    MinGW64编译好的可以用于Win7_VS平台下X64环境C++工程的ARPACK的dll&lib;库,适用于x64 debug/release mode.调用函数以及求解特征值特征向量的实例程序见本人博客及相关资源,提供下载.

    Opencv 411完整编译(内含Opencv411-contrib拓展模块),已经通过Cmake和VS2019编译通过直接使用

    肯定知道当前opencv官网提供的opencv现有库中,不能满足我们对Opencv整体的学习需要,如CNN::CUDA,thinning()函数等,如果要使用完整的opencv库,就得对相应的opencv拓展模块contrib进行重新编译。但编译过程真的...

    终于搞懂了,预编译头文件

    在左边的 <br>树形视图里选择整个工程  <br>Project Options(右下角的那个白的地方)可以看到 /Fp “debug/PCH.pch”,这就是指 <br>定生成的.pch文件的名字,默认的通常是 <工程名>.pch(我的示例工程名...

    使用VS2015编译和调用动态链接库dll

    使用VS2015编译和调用动态链接库dll 1. 首先建工程,选择dll,记得勾上“导出符号” 后面不用自己搞那些宏定义会省事很多。 建立工程myDll,记得勾上“导出符号” 类型选择dll 2. IDE自动生成的代码已经把整个架构...

    GNU libiconv-1.15和libintl-0.19.8.1,VS2017工程和 Makefile.mak 命令行编译文件

    GNU libiconv-1.15和libintl-0.19.8.1,VS2017工程和 Makefile.mak 命令行编译文件 CSDN-tags: libiconv1.15 libintl-0.19.8.1 VS2017 SDK17134.12 声明: 最新版,修正了relocatable.c文件中GetModuleFileName...

    GNU libiconv-1.15和libintl-0.19.8.1,VS2015工程和 Makefile 命令行编译文件

    GNU libiconv-1.15和libintl-0.19.8.1,VS2015工程和 Makefile 命令行编译文件 CSDN-tags: libiconv1.15 libintl 0.19.8.1 VS2015 Makefile 声明: 代码为本人良心制作,虽然花费了一定的时间和精力,但不保证...

    Vs2015ActiveMq测试工具.rar

    问题分析:使用activemq-cpp.dll之前用VS2008编译的dll文件,在vs2015上编译,会与Qt的库发生冲突。所以要重新在vs2015上编译activemq库,才可以编译。而且release要用release版本的库,位数和版本都要对应上。 (2...

    Tesseract4.0头文件,lib文件(Win10 64位+VS2015 64Bit Debug),OpenCV330

    首先按照网上的教程下载Tesseract4.0的源码,还有cppan和cMake(也是64位的),然后在Win10(64位)下用VS2015的64位,debug下编译生成的,自动在c:\program files下生成一个tesseract的文件夹,里面含有include和...

    Opencv3.4.1_Contrib+VC14_VC15+X86_X64+Debug_Release+Simple LIB

    OpenCV3.4.1的合并式函数库 包含Contrib拓展库 适用于VC14和VC15 X64和X86两种编译架构 Debug和Release两种编译模式 总共8种应用于不同编译环境的OpencCV函数库

    类C语言的脚本解析执行(使用C++语言编写)20080625

    本组建主要用于在程序中解析预先编写的类C脚本,并依据脚本执行,可通过调用外部指针函数读入输入变量执行计算,最终得出计算结果写入输出变量中;用户可通过读取输出变量获取最终的结果。 脚本中可调用函数,函数...

    usart_debug.h

    ggc编译环境下,有一个usart_debug.h头文件,使用直接加入头文件到工程,在需要使用的地方Include即可直接调用printf()函数-不支持浮点数输出

    CrashRpt_v.1.4.2_vs2008_also_ok

    4、此版本我用vs2008在debug与release版都编译通过了, 5、同时我会写一个博客告诉大家的用法,默认是没有vs2008的工程序需要使用cmake工具来生成,详见我的博客。 6、简介:crashrpt是一个包含能够在程序出现各种...

    VegaFEM编译好的库及头函数

    非刚体变形的开源库,编译好的lib库(debug版本)以及头文件,可以直接用于开发

    转载:已编译好的openssh库

    我在链接OpenSSL的静态函数库时遇到类似以下的问题: Linking... msvcrt.lib(MSVCRT.dll) : error LNK2005: _strchr already defined in libcmtd.lib(strchr.obj) ... 这是由于OpenSSL的静态函数库使用的是了...

    C# 调用c++ 库 参数为指针类型导出函数

    参数为指针类型导出函数 c# Csharp调用 c++库 参数为导入和导出指针两种 包含C++ DLL源码 如fun(cont char* A,char*B) A为输入参数,B为输出参数-C# CSharp call C++ DLL lib dll function param use export and ...

    VC++常用的共用函数100多页

    ◆全局函数的申明问题◆ 29 ◆在应用程序中*APP.CPP中的InitInstance()的事件◆ 29 ◆给执行文件加一个图标◆ 30 ◆如何在全局函数中通过传入的窗口句柄操作窗口◆ 30 ◆如何使桌面文字背景透明?◆ 30 ◆怎样才能在...

    FFMPEG实现RTSP码流解码和显示的程序实例V1.0

    4.示例程序中,只要修改rtsp地址,编译后即可解码,读者可修改回调函数,实现自己的功能; 5.本资源后期会不断更新版本,在应用中有任何问题,欢迎评论,我会尽力改进,使大家使用方便。 解压密码:ezhchai

Global site tag (gtag.js) - Google Analytics