我只是想知道究竟是什么导致了没有序言/尾声的函数的生成?如果程序仅使用 stdcall/cdecl 约定编译,为什么会有一些调用导致子例程没有典型的 push ebp -> mov ebp,esp。这些只是编译器生成的健全性检查吗?这些子程序重要吗?或者如果不实际分析它就不可能说出来?例如,编译器是否会生成对将一个值移动到 eax 然后返回的子例程的调用,还是程序员会更改可执行文件的二进制文件?
没有序言和尾声的功能?
逆向工程
职能
2021-07-08 07:20:59
2个回答
CPU不需要prologue 和 epilogue来执行函数,因此大多数编译器仅在必要时生成它们,或者未启用优化。特别是,叶函数(那些不调用其他函数的函数)通常不需要序言(除非 ABI 需要)并且编译器可以安全地省略它。
Frame-Pointer Omission 编译器选项:https : //msdn.microsoft.com/en-us/library/2kxx5t2c.aspx
对于 gcc,请参阅 -fomit-frame-pointer https://gcc.gnu.org/onlinedocs/gcc-4.5.2/gcc/Optimize-Options.html
其它你可能感兴趣的问题