c++ - 判断一个lib文件是否为2010 Build

标签 c++ visual-studio-2010 visual-studio-2008 visual-c++

我们正在将 C++ 源代码从 VS2008 迁移到 VS 2010。由于 lib 文件不正确,我们遇到了问题。

有什么方法可以确定一个lib文件是使用VS 2010还是VS 2008构建的?

最佳答案

严格来说,您无法直接从 lib 文件中获取它,因为它们只是 .obj 文件的容器(或者在导入库的情况下是“伪目标文件”)。可能有一个库包含由不同编译器创建的目标文件,但我怀疑你会经常看到这种情况,如果有的话。

但是,您可以从库中 包含的目标文件中提取信息。

我不知道此信息的可靠性如何,但 MSVC 生成的目标文件似乎包含有关用于构建它们的编译器的版本信息。目标文件包含一个名为“.debug$S”的部分,其中包含调试信息。但是,即使您构建了没有调试信息的目标文件,仍然会有一个小的“.debug$S”部分,对于使用 VS 2008 SP1(编译器版本 15.00.30729.01):

RAW DATA #2
  00000000: 04 00 00 00 F1 00 00 00 56 00 00 00 18 00 01 11  ....ñ...V.......
  00000010: 00 00 00 00 63 3A 5C 74 65 6D 70 5C 68 65 6C 6C  ....c:\temp\hell
  00000020: 6F 2E 6F 62 6A 00 3A 00 3C 11 00 22 00 00 07 00  o.obj.:.<.."....
  00000030: 0F 00 00 00 09 78 01 00 0F 00 00 00 09 78 01 00  .....x.......x..
  00000040: 4D 69 63 72 6F 73 6F 66 74 20 28 52 29 20 4F 70  Microsoft (R) Op
  00000050: 74 69 6D 69 7A 69 6E 67 20 43 6F 6D 70 69 6C 65  timizing Compile
  00000060: 72 00 00 00                                      r...

请注意,如果将编译器版本 15.00.30729.01 的组件转换为 16 位十六进制数,您将得到(以小端显示):

0f 00 00 00 09 78 01 00

这是一个字符串,您会注意到它在“.debug$S”部分的偏移量 0x30 和 0x38 处出现了两次。

对于 VS 2010 SP1(编译器版本 16.00.40219.01)生成以下“.debug$S”:

RAW DATA #2
  00000000: 04 00 00 00 F1 00 00 00 56 00 00 00 18 00 01 11  ....ñ...V.......
  00000010: 00 00 00 00 43 3A 5C 74 65 6D 70 5C 68 65 6C 6C  ....C:\temp\hell
  00000020: 6F 2E 6F 62 6A 00 3A 00 3C 11 00 22 00 00 07 00  o.obj.:.<.."....
  00000030: 10 00 00 00 1B 9D 01 00 10 00 00 00 1B 9D 01 00  ................
  00000040: 4D 69 63 72 6F 73 6F 66 74 20 28 52 29 20 4F 70  Microsoft (R) Op
  00000050: 74 69 6D 69 7A 69 6E 67 20 43 6F 6D 70 69 6C 65  timizing Compile
  00000060: 72 00 00 00                                      r...

您会在其中记下编译器版本数据 10 00 00 00 1B 9D 01 00

类似的签名由 VS 2003 到 VS 2012 编译器生成(VC6 不生成“.debug$S”部分,我没有办法测试 VS 2002)。但是,信息的偏移量有时会有所不同(根据实际使用的选项和正在编译的文件,即使是同一编译器也可能会有所不同)。

我不知道有什么工具可以很容易地提取这些信息,但是一些将 lib 工具和/或 dumpbin 串在一起的脚本可能会很好地拼凑在一起容易地。 Microsoft's "PE and COFF Specification" document如果您想自己分离库和目标文件,可能会有一些帮助,尽管该文档没有关于 .debug$S 部分的真实信息,除了它存在并包含调试信息。

请注意,据我所知,此信息未记录在案,而且我对它的逆向工程至少可以说是粗略的,并且可能会更改或不适用于所有情况。我真的不确定这些信息的可靠性,但如果没有其他更好的信息出现,这就是一个开始。

关于c++ - 判断一个lib文件是否为2010 Build,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12576032/

相关文章:

c++ - 错误 : could not convert ‘((const MyClass*)this)->MyClass::myLabel’ from ‘QLabel* const’ to ‘QLabel’

javascript - 使用 node.js 从 C++ 调用 JavaScript

visual-studio-2008 - Visual Studio 加载项 API 资源

wix - Visual Studio 2010 beta 2 和 WiX?

c# - 单击 CheckBoxList 上的特定项目时如何调用事件?

c++ - 跨命名空间和不同 .H 文件的友元类

c++ - 在 C++ 中获取所有打开窗口的列表并存储它们

c++ - 为我的项目中的库链接 libunwind 时出现链接器错误

visual-studio-2010 - 如何显示你在xml评论中设置的评论文字?

c# - 如何获取页眉的索引