我編譯使用Visual C++ 10以下程序:爲什麼一些函數密集定位,而其他函數是用int 3指令對齊和填充的?
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
指令。
爲什麼區別?爲什麼一些函數密集放置,而其他函數是用不可達代碼分隔的?
鑑於你的兩個例子:這兩個函數都以'8'的倍數開始,而以'7'結尾的函數恰好不需要任何填充。如果你能找到另一個與函數是8對齊的假設相矛盾的例子,請添加它。 –
@Steve Jessop:好的,但有11個字節的填充,而不是3. – sharptooth
糟糕,不,我很笨。第二種情況是'54',而不是'58'。 –