我用 Visual C++ 10 编译了以下程序:
include <Windows.h>
int _tmain(int /*argc*/, _TCHAR* /*argv*/[])
{
Sleep( 0 );
return 0;
}
并研究反汇编。程序镜像中有很多 C++ 运行时函数。一些函数位置密集 - 一些函数的 ret
后面是下一个函数的第一条指令。例如,
` __declspec(noreturn) void __cdecl __report_gsfailure(ULONGLONG StackCookie)`
结束于地址 004013B7
(有一个 ret
指令)并且地址 004013B8
包含调试器找不到的一些其他函数来源。与此同时
BOOL __cdecl _ValidateImageBase(PBYTE pImageBase)
结束于地址 00401554
但下一个函数
PIMAGE_SECTION_HEADER __cdecl _FindPESection( PBYTE pImageBase, DWORD_PTR rva )
从地址00401560
开始,后两个地址之间有多个int 3
指令。
为什么不同?为什么有的函数放得很密,有的函数用不可达的代码隔开?
最佳答案
我重现了这个行为。您还可以注意到,这些函数以 mov edi,edi 指令开头。
int 3 指令以及函数开头的 mov edi,edi 指令允许热修补。 当需要对函数进行热修补时,mov edi,edi 被替换为在函数入口点之前跳转的短跳转指令,而 int 3 指令被替换为跳转到修补函数的长跳转。
引用Anyone knows what "mov edi,edi " does?
不知道为什么 __report_gsfailure 前面只有 2 int 3,即使它以 mov edi,edi 指令开始......
关于c++ - 为什么有些函数分布密集,而另一些函数则用 int 3 指令对齐和填充?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7612430/