什么是桩代码(Stub)?

软件工程师、主攻高级编程语言虚拟机的设计与实现

164 👍 / 9 💬

问题描述

摘一段使用“桩代码”的场景,来自《程序员的自我修养》第一版第264页:
当延迟载入的API第一次被调用时,由链接器添加的特殊的桩代码就会启动,这个桩代码负责对DLL的装载工作。然后这个桩代码通过调用GetProcAddress来找到被调用API的地址。

题主问题中所说的“stub”的用法,下面几个词是相似的:

它们说的都是“一小块代码”,通常是有个caller要调用callee的时候,中间需要一些特殊处理的逻辑,就会用这种“小块代码”去做。有意思的是,这些词除了stub以外都跟“跳”有关系:

而“跳”正好生动的捕捉了这类stub的作用:它们并不是最终的调用目标,而是做一些简单的处理之后“跳”到真正的目标去。

很多时候这种“跳”都是一次性的:“跳”过去之后就不回来了。

题主提到的例子是动态链接库的延迟加载。还有许多其它类似的场景,举两个例子: