Internal error during IncrBuildImage 问题的解决办法

今天使用VS2008写了一个基于MFC的对话框的程序,在编译的时候出现了“LINK100:Internal error during IncrBuildImage“的错误,到网上搜了一下

找到错误的解决办法:

一、下微软的补丁:KB948127补丁来解决,http://code.msdn.microsoft.com/KB948127。貌似安装了也不起作用
    二、如果下载的补丁没安装成功或下载失败,可以用下面的方法手工来改工程设置 项目(Project)->属性(Property)->链接器(Linker)->常规(General) 下面的“启用增量链接(Enable Incremental Linking)”,将“是(/INCREMENTAL)”改为“否(/INCREMENTAL:NO)”。不过这又引入了另外一个警 告:FormatCom.obj : warning LNK4075: 忽略“/EDITANDCONTINUE”(由于“/INCREMENTAL:NO”规范)

选择项目,属性(Property pages)->配置属性(Configuration Properties) ->C/C++,修改“调试信息格式(Debug Information Format)”为“程序数据库(Program Database(/Zi))”即可。

网上有大牛写的测试,需找原因,这里引用一下  网址:http://blog.sina.com.cn/s/blog_7e01272201010k6d.html

看到这我又迷茫了,不断咒骂vs复杂的同时我搜索了增量链接这个东西,得到了如下的解释:
好的,文接上回,本文我就来讲讲微软link.exe连接器的Incremental Liking这个特性。当然这个其实不是微软linker独有的特性,很多链接器都有这个特性,这个特性实际上是为了提高链接速度的。

   想象一下这个场景,我写了两个函数foo()和bar(),其中foo()在0x400100处而bar()紧接着保存在0x400200处。现在我将 foo()改写了一下,添加了一些perfect的功能,然后编译了新的代码。不过现在的麻烦是foo()不可避免的变大了,他现在需要200h字节来保 存了。那么链接器该怎么办?

   一般的思考是——重新洗牌,将现有的编译好的exe删除了,然后重新布局所有的函数,也即是说bar()函数向后挪动0x100h字节的位置,给 foo()腾出空间来。然后之后所有的函数都需要重新定位……对于大型软件来说这个处理时间开销是痛苦的,但作为程序员我们却不能避免需要不断的调试改代 码,不断地重复这个耗时的工作。

  不过我们现在并不需要给客户最终的发行代码,我们只是想要尽快地将程序的bug改掉然后去休息而已!于是,Incremental Linking出现了!它的原理如下:

  现在连接器不会将所有函数紧挨着放在一块儿了,他们会在函数之间加上padding,这个时候函数要想添几句指令就有余地了。只要我们的改动不大,没有超过padding的范围连接器就不需要重新洗牌,这大大提高了链接的速度。

   先别高兴,加入我们的改动很大,以至于超过padding能够搞定的范围怎么办?如上图,我们还会在整个section末尾设置一个较大的 padding(当然具体在哪里要看实现,比如我这图是从GCC那里搞得,说的就是ld.exe的行为方式),这时候就可以将这个函数搬到这里来了。但有 个毁灭性的问题——所有调用我这个函数的函数都必须重定位他们的call指令啊!

  为了解决这个问题,我们引入了一个ILT表(Incremental Linking Table),这个表是放在.text区域中的(我在IDA中观察得知)。它的原理是什么呢?我们来看:

;之前我们都是直接调用函数call foo

;现在我们来点小把戏call foo_stub

foo_stub:jmp foo

复制代码

  我们现在不直接调用函数,而是call到一个包含jmp指令的地方,然后由这个指令将我们的程度带往foo()函数的实现去。现在如果我们将 foo()的实现改动过大后,linker直接将foo()移动了,然后只需要修改这个jmp指令就行了。可以看到,这种实现方式开销是O(1)。然后当 很多个函数都用这种方式时,就形成了一个有jmp指令构成的表——这就是ILT表啦。

  有兴趣的童鞋可以做下实验,在VS2010编译一次代码,然后用IDA或者W32Dasm之类的软件可以看到两个函数之间间隔了不少距离,而这些间隔就是我们所谓padding。padding被填充以0xCCh的数据。熟悉win32汇编的朋友这时候该笑而不语了,是的,这个值就是指令INT 3。在WIndows下,执行这个指令会引发一个异常,然后程序会被终止或是回到调试器去,这当然是出于安全性考虑的。这之后如果你在前一个函数加几句话,编译后可以看到两个函数位置不变,但函数间的padding变小了。

时间: 2024-10-18 04:56:47

Internal error during IncrBuildImage 问题的解决办法的相关文章

Eclipse运行时发生An internal error occurred during:“**************” 的解决办法

原因分析: 当前工作目录下的 .project 文件 不一致 例如1: 南京大学 Mooctest 提交考试试卷时出现的:An internal error occurred during:“提交考试结果” 例如2:Eclipse启动时发生An internal error occurred during: "Initializing Java Tooling". 解决方案:删除当前工作目录下的WORKSPACE_HOME/.metadata/.plugins/org.eclipse.

VS2010出现FileTracker : error FTK1011编译错误的解决办法

VS2010出现FileTracker : error FTK1011不知道是不是vs2010的一个bug,反正有人提交了. FileTracker : error FTK1011编译错误的解决办法有三个,推荐使用第二个 方法一:把目标框架改为Framewotk=4.0方法二:新增环境变量TRACKFILEACCESS=false:操作步骤:右击"我的电脑"(或"计算机")-->"高级"-->"环境变量"-->

"undefined method `root' for nil:NilClass" error when using "pod install" 解决办法

如果pod undate 的时候报错"undefined method `root' for nil:NilClass" error when using "pod install" 或 NoMethodError - undefined method `dirname' for nil:NilClass 检查你的podfile文件 保证一下信息存在 Pod::Spec.new do |s| s.name = "DDEBusiness" s.ve

GitHub提示 Error: Key already in use解决办法

GitHub提示 Error: Key already in use解决办法GitHub提示 Error: Key already in use解决办法2014年09月05日 ? 综合 ? 共 290字    ? 字号 小 中 大 ? 评论关闭 出现这个的原因是你在以前也用过GitHub,并且提交了你的密钥,这个时候你可以通过在命令行里输入  ssh -T -i ~/.ssh/id_rsa [email protected]来查看到底是哪一个账户在使用此密钥,会出现如下提示 其中saymagic

VS2008 fatal error LNK1000: Internal error during IncrBuildImage 解决方案

使用Visual Studio 2008编译链接程序的时候,遇到链接错误,错误信息如下: fatal error LNK1000: Internal error during IncrBuildImage 一般有如下3中解决方案: 第一:该问题仅仅在第一次编译的时候出现,重新编译就可以运行了: 第二:去微软官方下载KB948127补丁程序(见附件,但大多数机器安装不上,本人的机器也无法安装): 第三(该内容来自于网络):打开项目(Project)->属性(Property)->链接器(Link

DBCA建库时Error in invoking target 'collector' 解决办法

如果安装进度大约到65%时有错误提示: Error in invoking target 'collector' of makefile '/u01/app/oracle/product/10.2.0/db_1/sysman/lib/ins_emdb.mk'. 该错误直接跳过即可. INFO: /usr/bin/ld: i386 architecture of input file `/u01/app/oracle/product/10.2.0/db_1/sysman/lib/snmccolm.

Eclipse:Some sites could not be found. See the error log for more detail.解决办法

今天遇到了一个奇葩的问题,我把我的sdk tools的版本升级到23后,我在eclipse中尝试升级ADT,发现了这么一个问题,下面分析下原因: 当我在eclipse中选择Help-->Check for updates时,会弹出一个框,如下: 首先解释下这个错误出现的原因: Eclipse在check for updates时,是根据下图列表中所有的Available Software Sites来check的.当出现某一个site不存在时,就会出现上图的错误. 这里可能有人会问,我以前装的时

IIS出现Server Error in '/' Application.CS0016的解决办法

Server Error in '/' Application. Compilation Error Description: An error occurred during the compilation of a resource required to service this request. Please review the following specific error details and modify your source code appropriately. Com

转-java编译时error: illegal character '\ufeff' 的解决办法-https://blog.csdn.net/t518vs20s/article/details/80833061

原文链接:https://blog.csdn.net/shixing_11/article/details/6976900 最近开发人员通过SVN提交了xxx.java文件,因发布时该包有问题需要回退,故SCM将该xxx.java文件用editplus打开删除了新添的一行,删除后重新编译打包,却报了如下异常: java:[1,0] illegal character: \65279 表面看着该文件确实没错,看不出来问题,后来从SVN上更新下代码以后,发现本地也不报错,后来通过Eclipse查看了