使用不同.dll(导出相同的符号)静态链接的二进制文件
statically linked binary using a different .dll (which exports same symbols)
(阅读评论后改写的问题)
如果我有一个应用程序或.dll通过导入库静态动态链接到某些.dll,然后我用不同的(版本).dll替换后.dll,该导出原始.dll的所有符号并可能添加一些新符号,该怎么办?
具体来说,是否可以保证这会起作用?
这通常有效,并且是修复字段中的错误或安全漏洞的常用方法,而无需重新编译客户端程序。 成功的关键是 ABI 兼容性。
符号名称存在于 DLL 文件中,加载 DLL 时,按符号名称查找每个函数的地址。
可能阻止兼容性的特定陷阱:
- 两个 DLL 版本必须具有相同的体系结构(32 位或 64 位)。
- 两个 DLL 版本的参数和返回类型应匹配。
- 此外,每个函数调用的语义含义至少应该是等效的。 如果 DLL 具有用于添加小部件的
add_widget
函数,但在新的 DLL 中它删除了小部件,则可能存在问题。 - 调用约定需要在旧 DLL 和新 DLL 之间匹配。
- 如果使用不同的编译器或同一编译器的不同版本编译新 DLL,则未声明
extern "C"
符号可能会由于名称重整而中断。 - 如果跨 DLL 边界传递标准库类型,则标准库需要是相同的版本(客户端程序也需要使用该版本)。
相关文章:
- 如何从二进制文件中的给定符号中获取调用程序图
- 将无符号字符的向量写入二进制文件 c++
- vs comperied二进制文件中的符号
- 使用不同.dll(导出相同的符号)静态链接的二进制文件
- 如何告诉 clang 将调试符号放入可执行二进制文件中
- 无法使用 fstream 从二进制文件中读取字符串,而是显示奇怪的符号
- g++ 编译:我可以链接到带有符号链接二进制文件的目录吗?
- 将fortran生成的二进制文件读取到C++中的带符号整数数组中
- 计算 c# 中二进制文件符号的频率不起作用,但适用于等效的 c++ 代码
- 无法将大型无符号整数正确写入二进制文件 - C++
- 正在尝试读取4字节无符号整数的二进制文件并转换为伏特
- 向二进制文件写入和读取无符号字符
- 如何在没有文件、objdump或gdb的情况下知道二进制文件是否包含调试符号
- 如何避免iOS二进制文件中的符号和源路径
- 为什么使用write函数而不是整数将奇怪的符号写入二进制文件
- 带有调试符号的Clang二进制文件太大
- 类型是否在最终二进制文件中公开?它们在符号文件和RTTI中可用吗?
- 用c++将无符号字符存储为二进制文件
- 使用write()将无符号字符写入二进制文件
- 如何将二进制文件读入无符号字符向量