3

我们的情况是,我们有大量相互关联的 DLL 构成我们的产品。这是一个非常“古老”的产品(因为它已经开发了 20 多年),并且过去曾因 Visual Studio 的多个版本的结构封装的不同默认值而受到影响。

因此,在许多情况下,#pragma pack在 DLL 头文件中没有使用,但在项目属性中设置了结构对齐,我们可能会遇到这样的情况,即导入 DLL(通过其 lib 和头文件)的项目有不同的结构对齐并可能导致结构大小不匹配。

这很复杂,因为结构可以通过“意外”正确调整大小 - 例如,如果结构的所有成员都unsigned intpack(4)DLL 中并且pack(2)在导入项目中可以正常工作。当然,直到有人修改结构以添加bool例如。

我想通过#pragma pack在所有导出模块的头文件中添加语句来消除所有这些潜在的混淆,但首先想评估我们当前的代码中是否存在任何此类暴露(在这里考虑难以跟踪的运行时错误)。此外,在我们的构建过程中引入一些自动检查可能很有用,以确保我们永远不会遇到这些情况,即使使用第三方 DLL 或 LIB。

所以,我的问题:

是否有可能从已编译的 DLL 或其关联的 LIB 中确定在编译 DLL 时有效的结构对齐方式?同样,是否有可能为 EXE 发现这一点?

我想知道是否有任何 PE 格式或 LIB(是 COFF 吗?)可用于查找此信息?

更新

好吧,使用 dumpbin 检查库和 dll 并没有什么好处,所以我将尝试从我们从发布版本生成的 PDB 文件中获取一些信息。我发现这是一个起点...

4

1 回答 1

3

我会说这是不可能的。C++ 没有应用类型信息(除非启用 RTTI,但对这个问题没有太大帮助)。对于程序员来说,结构只不过是一个字节序列。编译器将variable.member用适当的字节对齐替换 以访问该数据。

我怀疑您是否有正确的调试信息(即 PDB 文件)供 DLL 查找符号。即使这样,也无法找到结构的“包装”。

我在不同的 EXE/DLL(具有完整的源代码)中遇到了结构大小的问题,这sizeof是我们可以用来查找差异的唯一工具(并嵌套查找问题的根源)。即使使用这种技术,也不可能为特定结构启用哪种包装。

于 2013-09-16T16:32:31.340 回答