windows - 是否可以找到 DLL 中声明的结构的大小?

标签 windows visual-c++ visual-studio-2012 dll memory-alignment

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

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

结构可以通过“意外”正确调整大小这一事实使情况变得复杂 - 例如如果结构的所有成员都是 unsigned int 那么 DLL 中的 pack(4) 和导入项目中的 pack(2) 可以正常工作.当然,直到有人修改结构以添加一个 bool 示例。

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

那么,我的问题是:

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

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

更新

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

最佳答案

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

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

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

关于windows - 是否可以找到 DLL 中声明的结构的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18831102/

相关文章:

c++ - 在 Visual Studio 中通过 printf() 打印 std::string

c - 如何从Windows内核空间中的任意地址获取模块镜像名称?

windows - 如何使 Windows 键成为 Windows 下的 IntelliJ IDEA Command/Meta 键?

windows - 如何从角色中找出语言?

c - VS2010 多项目解决方案 - 控制台和表单应用程序

c++ - Visual Studio 的对象文件

c++ - 尽管有析构函数调用,但内存泄漏

java - 如何在Windows中使用cmd将war文件解压到新文件夹(或另一个驱动器)

c++ - 带有 MSVC++ 编译器的 Gdi+ 出现奇怪的 "Native Graphics"运行时错误

c# - T4 模板 - 从实现接口(interface)的类生成单元测试类