最近我拆解了一个用c/c++编写的DLL文件,并注意到在代码段中有许多"跳转存根"。这些存根除了跳转到DLL内部的函数外,没有其他作用。
例如:
为什么编译器(Visual Studio 2012)会在二进制文件中包含这些函数存根?
谢谢!
例如:
jmp foo()
jmp foo2()
...
为什么编译器(Visual Studio 2012)会在二进制文件中包含这些函数存根?
谢谢!
jmp foo()
jmp foo2()
...
void (*fptr)() = foo;
foo
只是指向DLL中的一个位置的引用,那么如何解析该地址将取决于加载程序。解决这个问题要比解决“这里有一个foo()入口点,可以让你到达真正的foo”问题复杂得多。foo
是 mydll.dll
的一部分,而不是 myprog.exe
。 - Mats PeterssonDLL是可重定位的,这意味着它们可能出现在内存中的任何位置。这意味着所有对它们的调用都必须被重新编写。通过将所有这样的调用保持在一个小的跳转表中,只有一页需要在重定位时被重新编写。这很重要,因为未更改的代码页可以在进程之间共享,但每个进程都有自己的修改后的页面副本。