我们有这样的情况:我们有大量的相互关联的DLL来组成我们的产品。 这是一个非常“古老”的产品(就像它已经发展了20年),过去由于Visual Studio的几个版本的结构包装的不同默认设置而遭受了损失。
所以,在DLL头文件中没有使用#pragma pack
情况下,但是在项目属性中已经设置了结构alignment的情况下,我们可以得到这样的情况:导入DLL的项目(通过它的lib和头)具有不同的结构alignment,并可能导致结构尺寸不匹配。
这很复杂的事实,结构可以通过“事故”正确的大小 – 例如,如果结构的所有成员都是unsigned int
然后pack(4)
在DLL和pack(2)
在导入项目可以正常工作。 当然,直到有人修改一个结构来添加一个bool
例如。
我想通过将#pragma pack
语句添加到所有导出模块的头文件中来消除所有这些潜在的混淆,但是首先要评估我们当前代码中是否有这样的暴露(考虑难以跟踪的运行时错误这里)。 另外,在我们的构build过程中引入一些自动检查以确保我们永远不会遇到这种情况,即使使用第三方DLL或LIB也是有用的。
所以,我的问题是:
从编译的DLL或其关联的LIB中,可以确定在编译DLL时哪些结构alignment是有效的? 同样,是否有可能发现这个EXE?
我想知道的是,如果有什么PE格式或LIB(是COFF?)可以用来find这些信息?
UPDATE
那么,使用dumpbin检查libs和dll是没有好处的,所以我将尝试从我们的Release版本生成的PDB文件中获取一些信息。 我觉得这是一个起点…
我会说这是不可能的。 C ++没有应用类型信息(除非使用RTTI启用,但对这个问题没有太大的帮助)。 结构只不过是程序员的一个字节序列。 编译器将用适当的字节对齐来替换variable.member
来访问这些数据。
我怀疑你有正确的调试信息(即PDB文件)的DLL查找符号。 即使如此,也不可能找到一个结构的“包装”。
我在不同的EXE / DLL(具有完整的源代码)中遇到了结构大小的问题,其中sizeof
只是我们可以用来查找差异的工具(并且嵌套查找问题的根源)。 即使采用这种技术,也不可能为特定结构启用哪种包装。