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

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

本文关键字:符号 二进制文件 静态 链接 dll      更新时间:2023-10-16

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

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

具体来说,是否可以保证这会起作用?

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

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

可能阻止兼容性的特定陷阱:

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