为什么某些函数位于密集状态而其他函数与int 3指令对齐并填充?

时间:2011-09-30 15:10:56

标签: c++ visual-c++ compiler-construction linker disassembly

我使用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条指令。

为何与众不同?为什么有些函数被密集放置而其他函数被无法访问的代码分开?

2 个答案:

答案 0 :(得分:1)

我重现了这种行为。你也可以注意到这些函数以mov edi,edi intruction开头。

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指令开头......

答案 1 :(得分:1)