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

statically linked binary using a different .dll (which exports same symbols)

(阅读评论后改写的问题)

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

具体来说,能否保证这会奏效?

这通常有效,并且是在现场修复错误或安全漏洞的常用方法,无需重新编译客户端程序。成功的关键是ABI compatibility

符号名存在于DLL文件中,加载DLL时根据符号名查找每个函数的地址。

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

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