MSVS 2010 C++编译器和堆栈对齐问题



我的问题是 MSVS 2010 C++编译器从另一个 dll 中解析的运行时解析的函数调用(GetProcAddress+GetModuleHandle)返回后以某种方式生成代码,然后编译器尝试以这种方式对齐堆栈:

   CALL DWORD PTR DS:[2000367C]             ;  apiresolvedinruntime.dll
   ADD ESP,12                               ;  <- this is the stack alignment

这当然是覆盖返回地址和我的程序崩溃,有人可以解释为什么编译器在真的不应该这样做的时候对齐堆栈吗?

您没有使用正确的调用约定调用运行时加载的函数。调用约定指定堆栈所发生情况的默认处理。最有可能的是,DLL 是使用 __stdcall 调用约定(例如 Windows DLL 使用的约定)编译的,该约定指定被调用的函数应该清理堆栈,但调用代码是使用 __cdecl 调用约定(这是默认值)使用函数指针声明的。在__cdecl下,函数支持可变参数,因此调用方需要对堆栈进行清理,因为被调用的函数不知道传递了多少参数。

需要验证 DLL 和调用代码是否使用相同的调用约定进行编译。

相关内容

  • 没有找到相关文章