关于共享库的新手问题:在C中,当加载动态库时,我们使用dlopen然后使用dlsym来查找符号或函数。现在让我们说,我们在dll中查找的函数输入为:
int add(int a, int b);
但如果我们将它转换为其他类型,比如说,
typedef int (*sum)(int a, int b, int c);
会发生什么? C运行时会抱怨吗?
谢谢!
答案 0 :(得分:2)
长话短说,这是未定义的行为。在C中调用具有错误参数数量的函数(即使没有dlopen
/ dlfree
也可以通过转换函数指针来执行此操作)会产生未定义的行为。
对于callee-clean调用约定,如stdcall
,使用错误的数字或类型参数将产生堆栈不平衡(被调用者将堆栈调整到错误的位置)。堆栈不平衡会通过破坏调用者的返回地址和局部变量来快速杀死程序(如果幸运的话)。
对于调用者干净的调用约定,效果很像调用例如printf
参数数量错误:函数可能使用垃圾参数表现不正常,但您的程序可能不会爆炸。 (这通常是不可取的;例如,攻击者可以利用它来控制你的程序。)