我正在尝试使用 lcc 编译器从 C 调用 DLL 函数(通过 GetProcAddress 等)。该函数被调用并且一切顺利,但看起来堆栈的顶部已损坏。我尝试使用调用约定(__stdcall / __cdecl),但这没有帮助。
不幸的是,我无法访问 dll 代码,必须使用 lcc 编译器。
我发现这个简单的技巧可以避免堆栈损坏:
void foo(params)
{
int dummy;
dll_foo(params);
}
这里的 dll_foo 是 GetProcAddress 返回的指针,并且堆栈受到虚拟变量的保护。因此,损坏的不是堆栈指针,而是堆栈顶部的数据。它是这样工作的,但我想知道腐败的原因。
有任何想法吗?
UPD:正如评论中所问的,这里是实际的函数类型:
typedef unsigned char (CALLBACK Tfr)(unsigned char);
typedef void (CALLBACK Tfw)(unsigned char,unsigned char);
typedef int (CALLBACK Tfs)(int);
typedef void (CALLBACK Tfwf)(int*,int);
他们都表现出类似的行为。
不幸的是,附加调试器并不是那么简单,因为代码是由 Matlab 编译和启动的,使用 LCC 编译器,并且没有调试支持。可能我将不得不在独立配置中重现此问题,但要做到这一点并不容易。