0

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

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

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

4

1 回答 1

4

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

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

于 2012-07-01T00:11:33.150 回答