最近,我反汇编了一个DLL(用c/c++编写),并注意到代码段内有许多“跳转存根”。这些存根除了跳到DLL中的某个函数外什么也不做。
例如:
jmp foo()
jmp foo2()
...
为什么编译器(Visual Studio 2012)在二进制文件中包含这些函数存根?
谢谢!
最佳答案
所有存根之后是否都有一大堆0xCC字节?如果是这样,则您正在查看已启用增量链接进行编译的代码(调试版本的默认设置)。
进行增量链接编译时,编译器会为每个函数创建一个存根,并确保所有调用都通过该存根。万一某个功能需要用更新的代码替换,则可以在末尾添加新代码,并且只需要修补跳跳代码-所有现有调用都将重定向到新代码。如果添加了新功能,则额外的CC保留给更多的存根。
有关更多背景信息,see MSDN。