增量链接

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

  假如我们的改动很大,以至于超过padding能够搞定的范围怎么办?如上图,我们还会在整个section末尾设置一个较大的padding(当然具体在哪里要看实现,比如我这图是从GCC那里搞得,说的就是ld.exe的行为方式),这时候就可以将这个函数搬到这里来了

  

但有个毁灭性的问题——所有调用我这个函数的函数都必须重定位他们的call指令啊!

  为了解决这个问题,我们引入了一个ILT表(Incremental Linking Table),这个表是放在.text区域中的(我在IDA中观察得知)

在VS2010编译一次代码,然后用IDA或者W32Dasm之类的软件可以看到两个函数之间间隔了不少距离,而这些间隔就是我们所谓padding。padding被填充以0xCCh的数据。熟悉win32汇编的朋友这时候该笑而不语了,是的,这个值就是指令INT 3

时间: 2024-10-24 05:46:55

增量链接的相关文章

【转】关于增量链接(incremental linking)

增量链接(Incremental Linking)这个词语在使用Visual C++时经常会遇到(其实不只是VS系列,其它链接器也有这个特性), 就比如经常遇到的:上一个增量链接没有生成它, 正在执行完全链接.  但是它是什么意思呢? 很多人只是经常看到, 但是不明白这是什么. 首先说明一下, 这个特性是链接器为了<提高链接速度>而增加的功能. 说是这样, 可能不理解, 下面就说说其原理: 有一个源代码文件, 你写了许多许多行, 你正在调试它, 你突然发现某个地方有一个小BUG, 你打算改正,

incremental linking(增量链接)的作用

转:incremental linking(增量链接)的作用 今天编译一个C++程序时,报了一个奇怪的错误(之前是好好的): 1>LINK : fatal error LNK1123: failure during conversion to COFF: file invalid or corrupt Google上搜了一下解决方案: 把Project Properties -> Configuration Properties  -> Linker (General) -> En

解决Cannot find or open the PDB file问题

今天使用opencv里的mat想要保存数据里边的像素的平均值和标准差: 但是编程好了之后会出现下面的问题,不能找到pdb file .下面将提供三种解决方法以及产生问题的原因. 程序也运行不出来,整个人都不好了.后来上贴吧和网上搜,有很多种解决办法,但是对我最用的是第1个: 方法1.首先确认是不是建立的空项目而不是win32位控制台项目,如果建立的是空项目,建议把空项目改成win32位控制台项目,问题一下子就解决了. 方法2.还有种说法是其实问题在于,在空项目中不生成调试文件pdb,所以无法调试

【转】《windows核心编程》读书笔记

这篇笔记是我在读<Windows核心编程>第5版时做的记录和总结(部分章节是第4版的书),没有摘抄原句,包含了很多我个人的思考和对实现的推断,因此不少条款和Windows实际机制可能有出入,但应该是合理的.开头几章由于我追求简洁,往往是很多单独的字句,后面的内容更为连贯. 海量细节. 第1章    错误处理 1.         GetLastError返回的是最后的错误码,即更早的错误码可能被覆盖. 2.         GetLastError可能用于描述成功的原因(CreatEvent)

配置VS2013 OpenCL环境

配置VS2013 OpenCL环境 1. 安装CUDA安装包 由于目前的CUDA安装包自带显卡驱动.CUAD工具.OpenCL的SDK:其中OpenCL的相关内容的默认目录有: CL文件夹的目录:C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.0\include OpenCL.lib文件目录:C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.0\lib OpenCL.dll文件目

Windows 7 配置驱动开发环境(使用WDK)

1.安装VS2010:官网下载WDK(就是早期的DDK),解压安装(GRMWDK_EN_7600_1): 2.在VS2010中建立空项目,项目可以命名为"driver": 3.配置解决方案,增加一个叫做driver的配置方案: 4.配置工程属性: 这个时候需要输入自己的WDK的安装路径,我的是这样的: 可执行文件目录:G:\WinDDK\7600.16385.1\bin\x86 包含文件(3个):G:\WinDDK\7600.16385.1\inc\api G:\WinDDK\7600

tcpSrv在vs2008中报错

报错内容: 1>LINK : warning LNK4076: 无效的增量状态文件“F:\VC_proj\Cproj\Debug\Cproj.ilk”:正在非增量链接1>lase.obj : error LNK2028: 无法解析的标记(0A000013) "extern "C" int __stdcall closesocket(unsigned int)" ([email protected]@[email protected]),该标记在函数 &q

OPENCV(环境配置)

转:http://blog.csdn.net/poem_qianmo/article/details/19809337 其中:跳过了"2.配置环境变量",其它大致一样. 最后出现几个错误,分别是: 第一个错误:fatal error LNK1104: 无法打开文件".obj":LINK : fatal error LNK1104: 无法打开文件"xx.lib" 解决方案:http://blog.sina.com.cn/s/blog_9015f32

VS2008执行MFC程序,提示microsoft incremental linker已停止工作解决方法

事实上这边是由于设置有问题.详细的解决方式例如以下: 第一步:点击项目->"你的文件"属性->配置属性->链接器->启用增量链接   将  是(/INCREMENTAL)改为 否(/INCREMENTAL:NO) 第二步:点击项目->"你的文件"属性->配置属性->C/C++  将调试信息格式改为程序数据库(/Zi) 改完之后.又一次调试一下程序,是不是问题已经攻克了? 下面附上截图: