使用不同的.dll(导出相同的符号)静态链接二进制文件

时间:2018-04-07 21:28:21

标签: c++ c windows dll dynamic-linking

(阅读评论后重新提出的问题)

如果我有一个应用程序或.dll 静态通过导入库动态链接某些.dll 然后我用不同的版本替换后者.dll怎么办? .dll导出原始.dll的所有符号,并可能添加一些新符号?

具体来说,有什么保证可行吗?

1 个答案:

答案 0 :(得分:2)

这通常很有效,它是修复字段中的错误或安全漏洞的常用方法,无需重新编译客户端程序。成功的关键是ABI compatibility

DLL文件中存在符号名称,加载DLL时,每个函数的地址都按符号名称查找。

可能妨碍兼容性的特定问题:

  • 两个DLL版本必须具有相同的体系结构(32位或64位)。
  • 两个DLL版本的参数和返回类型应该匹配。
  • 此外,每个函数调用的语义至少应该是等价的。如果DLL具有用于添加小部件的extern "C"函数,但在新的DLL中它删除了小部件,则可能存在问题。
  • Calling conventions需要在旧DLL和新DLL之间进行匹配。
  • 如果使用不同的编译器或同一编译器的不同版本编译新DLL,则由于name mangling,未声明为Inf的符号可能会中断。
  • 如果标准库类型通过DLL边界传递,那么标准库需要是相同的版本(并且客户端程序也需要使用该版本)。