我们的情况是,我们有大量相互关联的 DLL 构成我们的产品。这是一个非常“古老”的产品(因为它已经开发了 20 多年),并且过去曾因 Visual Studio 的多个版本的结构封装的不同默认值而受到影响。
因此,在许多情况下,#pragma pack
在 DLL 头文件中没有使用,但在项目属性中设置了结构对齐,我们可能会遇到这样的情况,即导入 DLL(通过其 lib 和头文件)的项目有不同的结构对齐并可能导致结构大小不匹配。
这很复杂,因为结构可以通过“意外”正确调整大小 - 例如,如果结构的所有成员都unsigned int
在pack(4)
DLL 中并且pack(2)
在导入项目中可以正常工作。当然,直到有人修改结构以添加bool
例如。
我想通过#pragma pack
在所有导出模块的头文件中添加语句来消除所有这些潜在的混淆,但首先想评估我们当前的代码中是否存在任何此类暴露(在这里考虑难以跟踪的运行时错误)。此外,在我们的构建过程中引入一些自动检查可能很有用,以确保我们永远不会遇到这些情况,即使使用第三方 DLL 或 LIB。
所以,我的问题:
是否有可能从已编译的 DLL 或其关联的 LIB 中确定在编译 DLL 时有效的结构对齐方式?同样,是否有可能为 EXE 发现这一点?
我想知道是否有任何 PE 格式或 LIB(是 COFF 吗?)可用于查找此信息?
更新
好吧,使用 dumpbin 检查库和 dll 并没有什么好处,所以我将尝试从我们从发布版本生成的 PDB 文件中获取一些信息。我发现这是一个起点...