Internal error during IncrBuildImage 问题的解决办法

J-July 2021-08-29 原文


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变小了。

发表于
2015-07-30 22:07 
J_July 
阅读(989
评论(0
编辑 
收藏 
举报

 

版权声明:本文为J-July原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/J-July/p/4690780.html

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

  1. IIS Service Unavailable HTTP Error 503. The service is unavailable.

    IIS突然报了上图这样一个错误,很意外,这问题的来源百度上有多个版本,处理的办法几乎都是一样的,你可以通过下边 […]...

  2. Unknown error 0x800A1518

    soap ENDMessage报这样的错误,经过长时间的调试,还是解决不了; 解决:换方法吧,不要用动态连接库 […]...

  3. Jmeter:运行报:Error occurred starting thread group :线程组, error message:Invalid duration 0 set in Thread Group:线程组, see log file for more details

    最近在用jmeter做压测,上周五压测的脚本,今天早晨结束后。 点击同样的脚本,运行就报Error occur […]...

  4. nginx出现500 Internal Server Error错误的解决办法

    来自:http://www.asklinux.com/webserver/nginx/165 —& […]...

  5. Performing Push Install adb: error: failed to get feature set: more than one 解决方案

    问题背景   直接 adb install 包名  无法安装成功   解决方案 安装 adb -s 10.20 […]...

  6. jquery AJAX 拦截器 success error

    在和后端数据交互的时候有些时候会遇到一些有权限的接口, 后端没有设置Status Code,返回的是Statu […]...

  7. Unknown error (0×80005000) (type COMException) TFS 2010

    迁移源代码服务器,于是在一台装有Windows Server 2008的机器上安装TFS 2010。在配置到准 […]...

  8. error: access denied for user to path – Ivan Sun

    error: access denied for user to path Here is the error […]...

随机推荐

  1. 在线笔试经历

    PS:感谢给予我面试/笔试机会的公司与人员,多谢! 收到一个在线笔试的邮件。 要求全程开启摄像头,使用chro […]...

  2. js弹出幕布遮罩层

    简单的css,可以根据要求自定义内容区域大小: #customPop{position:fixed;_posi […]...

  3. session 的工作原理 – code->

    session 的工作原理 1、什么是 session session 是浏览器和服务器会话过程中,服务器分配 […]...

  4. java中使用json

    java中使用json需要引入第三方json项目 json官网: http://json.org json官网 […]...

  5. SQLServer 统计数据量

    做一个项目,第一件事情就是问:“这个数据库多大?” 下面是统计数据库数据量大小的方法   通常我们会使用命令: […]...

  6. python3:操作excel文件

    前提:自动化接口测试中,可以将用例放在excel中管理。结合实际情况讲解如何操作excel文件 1.安装xlr […]...

  7. Java描述设计模式(15):责任链模式

    本文源码:GitHub·点这里 || GitEE·点这里 一、生活场景描述 1、请假审批流程 公司常见的请假审 […]...

  8. linux服务器负载问题排查

    linux服务器负载问题排查 目录 一、CPU和内存问题 top命令 vmstat命令 free命令 二、磁盘 […]...

展开目录

目录导航