【发布时间】:2015-11-17 04:20:50
【问题描述】:
最近我开始使用 Windbg(x64),为了玩它,我用它编译了一个示例程序(x64)
cl.exe ls.c /Zi /Od /GS-
有趣的是,为可执行文件生成的函数包含 FPO 优化。下面是一个例程的反汇编的sn-p。
0:000> uf ls!GetDateString
ls!GetDateString:
00007ff7`459a6d00 mov qword ptr [rsp+8],rcx
00007ff7`459a6d05 sub rsp,88h
00007ff7`459a6d0c mov qword ptr [rsp+58h],0
00007ff7`459a6d15 mov qword ptr [rsp+50h],0
00007ff7`459a6d1e mov eax,dword ptr [ls!dateType (00007ff7`45a14494)]
00007ff7`459a6d24 and eax,1
00007ff7`459a6d27 test eax,eax
00007ff7`459a6d29 je ls!GetDateString+0x3e (00007ff7`459a6d3e)
我可以知道如何在 x64 VC++ 编译器上禁用此 FPO 优化。查看官方文档似乎我们无法通过 /Oy- 开关禁用它 https://msdn.microsoft.com/en-us/library/2kxx5t2c.aspx
/Oy 启用帧指针省略和 /Oy- 禁用省略。 /Oy 是 仅在 x86 编译器中可用。
我想知道这个标志是否仅适用于 x86,那么像 FileTimeToSystemTime 这样的 x64 Windows 例程怎么会禁用 FPO!
0:000> uf .
KERNELBASE!FileTimeToSystemTime:
00007ffc`a03ad120 mov qword ptr [rsp+18h],rbx
00007ffc`a03ad125 push rbp
00007ffc`a03ad126 mov rbp,rsp
00007ffc`a03ad129 sub rsp,40h
00007ffc`a03ad12d mov rax,qword ptr [KERNELBASE!_security_cookie (00007ffc`a0515000)]
00007ffc`a03ad134 xor rax,rsp
00007ffc`a03ad137 mov qword ptr [rbp-8],rax
00007ffc`a03ad13b mov eax,dword ptr [rcx]
00007ffc`a03ad13d mov rbx,rdx
00007ffc`a03ad140 mov dword ptr [rbp-20h],eax
00007ffc`a03ad143 mov eax,dword ptr [rcx+4]
00007ffc`a03ad146 mov dword ptr [rbp-1Ch],eax
【问题讨论】:
-
“为什么像 FileTimeToSystemTime 这样的 x64 Windows 例程禁用了 FPO!” - 操作系统没有使用作为 Visual Studio 一部分提供的相同编译器进行编译。
-
为什么要禁用帧指针省略?
-
@RossRidge 我真的不想禁用帧指针省略。但只是想知道 Windows 二进制文件的 x64 版本是如何禁用 FPO 的。我正在寻找某种可能导致这种情况的编译器标志。我对 FPO 优化很好。
-
Microsoft x64 ABI 不要求函数具有帧指针,除非函数在堆栈上动态分配空间。
标签: windows winapi visual-c++ windbg disassembly