关于共享库的新手问题:在C语言中,加载动态库时,我们使用dlopen,然后使用dlsym来查找符号或函数。现在假设,我们在 dll 中查找的函数类型为:
int add(int a, int b);
但是如果我们将它转换为另一种类型,比如说,
typedef int (*sum)(int a, int b, int c);
会发生什么? C 运行时会提示吗?
谢谢!
最佳答案
长话短说,这是未定义的行为。在 C 中使用错误数量的参数调用函数(即使没有 dlopen
/dlfree
也可以通过转换函数指针来实现)会产生未定义的行为。
对于 callee-clean 调用约定,如 stdcall
,使用错误数量或类型的参数将产生堆栈不平衡(被调用方将堆栈调整到错误位置).堆栈不平衡会破坏调用者的返回地址和局部变量,从而迅速杀死程序(如果幸运的话)。
对于 caller-clean 调用约定,效果很像调用例如printf
参数数量错误:函数可能会因使用垃圾参数而出现异常行为,但您的程序可能不会崩溃。 (这通常是不可取的;例如,攻击者可以利用它来控制您的程序)。
关于c - 动态库函数转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23305125/