为什么有些函数的位置很密集,而另一些函数用INT3指令对齐和填充? 我用Visual C++ 10编写了以下程序: include <Windows.h> int _tmain(int /*argc*/, _TCHAR* /*argv*/[]) { Sleep( 0 ); return 0; }

为什么有些函数的位置很密集,而另一些函数用INT3指令对齐和填充? 我用Visual C++ 10编写了以下程序: include <Windows.h> int _tmain(int /*argc*/, _TCHAR* /*argv*/[]) { Sleep( 0 ); return 0; },c++,visual-c++,compiler-construction,linker,disassembly,C++,Visual C++,Compiler Construction,Linker,Disassembly,在地址004013B7处结束(有一条ret指令),地址004013B8包含调试器找不到源的其他函数。同时 BOOL __cdecl _ValidateImageBase(PBYTE pImageBase) 在地址00401554处结束,但下一个函数 PIMAGE_SECTION_HEADER __cdecl _FindPESection( PBYTE pImageBase, DWORD_PTR rva ) 从地址00401560开始,后两个地址之间有多条int 3指令 为什么不同?为什么有些

在地址
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指令被跳转到已插接函数的长跳转指令替换


不知道为什么uuu report\u gsfailure只在2 int 3之前出现,即使它以mov edi、edi指令开始…

给出两个示例:两个函数都以
8的倍数开始,而以
7
结束的函数恰好不需要任何填充。如果你能找到另一个与函数是8对齐的假设相矛盾的例子,请加上它。@Steve Jessop:好的,但是有11字节的填充,而不是3字节。哎呀,不,我太笨了。在第二种情况下是
54
,而不是
58
。我想了想,但结果是有些函数是以
mov edi开始的,edi
,同时前面没有填充。结果是有些函数是以mov edi开始的,值得一提的是,如果你有一个与Windows相关的问题,很可能Raymond Chen已经发布了答案,所以在提问之前,你一定要查看他的优秀博客。
PIMAGE_SECTION_HEADER __cdecl _FindPESection( PBYTE pImageBase, DWORD_PTR rva )