c - 动态库函数转换

标签 c dll shared-libraries dynamic-library

关于共享库的新手问题:在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/

相关文章:

运行时的 C++ 编译

c - OpenSSL:如何使用 p、q 和 e 创建 RSA 结构

c - 我想获取用户输入并返回每个字符串的第一个字母

c - 关于使用 libssl 编程的任何好的例子?

visual-studio-2008 - 检索 COM 类工厂失败。错误 : 80040154

c++ - 来自 C 和 C++ 目标文件的共享库

c - 为什么我会收到有关初始化程序不是常量的错误消息?

c++ - 如何编译 C++ dll 以使用 Lua? (我收到错误加载模块)

c - 使用嵌入式 R.dll 编译的 C 程序在调用标准 C 函数 fprintf() 时崩溃

c - 如何在特定时间打印内存中的所有共享对象?