确定lib文件是否为2010 Build

时间:2012-09-25 04:02:50

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

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

有没有办法确定是使用VS 2010还是VS 2008构建lib文件?

1 个答案:

答案 0 :(得分:1)

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

但是,您可以从库中的所包含的目标文件中哄骗信息。

我不知道这些信息有多可靠,但似乎MSVC生成的目标文件包含有关用于构建它们的编译器的版本信息。目标文件包含名为“.debug $ S”的部分,其中包含调试信息。但是,即使您构建了没有调试信息的目标文件,仍然会有一个小的“.debug $ S”部分,对于使用VS 2008 SP1编译的简单“hello world”程序,它可能如下所示(编译器)版本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

这是一个你会注意到的字符串,在偏差0x30和0x38的“.debug $ S”部分显示两次。

对于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部分的真实信息,除了它存在并包含调试信息。

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