debug模式下汇编 ILT (Incremental Link Table) 增量链接表解析(汇编)

版权声明:本博客为个人原创,转载请注明出处 https://blog.csdn.net/qq_33826564/article/details/81608318

debug模式下汇编 ILT (Incremental Link Table) 增量链接表解析


目录

引入

在研究C语言函数调用的过程中,看到一些汇编代码,在函数跳转的时候写到

004010DC call @ILT+5(Test) (0040100a)

这里的 ILT到底是什么鬼呢,为什么不直接 call 加函数地址就好了呢,非得整出个 ILT。本来我是不想深究的,但是后来查了一下,还是很有意思的,因为我学过微机原理,这和中断向量表很类似。什么是中断向量表呢?百度是这样解释的。

中断源的识别标志,可用来形成相应的中断服务程序的入口地址或存放中断服务程序的首地址称为中断向量

解析

和前面所述的中断向量表的思想基本一致。比方说我们程序调用了100次某函数 func() ,所以在这100次调用处就有100次 cal(姑且这样认为),那好,如果 func() 这个函数被我们修改了,我们增加了代码,他现在已经不在原来的地址(代码段)了,那么,编译器岂不是要为我们修改100次 cal 指令吗,这对我们调试来说是十分不方便的,所以我们就有了这个ILT
MSVC 在 Debug build 中用上了Incremental Link Table, ILT其实就是一串 jmp语句,每个jmp语句对应一个函数,jmp的目的地就是函数的入口点,和没有ILT的区别是,现在对函数的调用不是直接call到函数入口点了,而是callILT中对应的位置,而这个位置上什么也不做,直接 jmp到函数中去。这样的好处是,当一个函数入口地址改变时,只要修改ILT中对应值就搞定了,用不着修改每一个调用位置,用一个冗余的 ITL 把时间复杂度从O(n)将为O(1),值得,当然Debug版的二进制文件会稍大稍慢,Release版不会用上ILT

参看链接

参看
https://blog.csdn.net/tiewen/article/details/8615287
https://www.baidu.com/link?url=5bSGpBiwhKiFrwi2nVBwO1ELhUe3ZLpkp68ZdwdFN8XgrFN9FoO_UK2-4elV_Uxw&wd=&eqid=fe8cf7ac0000c2f8000000065b6feed8

猜你喜欢

转载自blog.csdn.net/qq_33826564/article/details/81608318