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
到函数入口点了,而是call
到ILT
中对应的位置,而这个位置上什么也不做,直接 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