判断一个lib文件是不是为2010 Build

Posted

技术标签:

【中文标题】判断一个lib文件是不是为2010 Build【英文标题】:Determine whether a lib file is 2010 Build判断一个lib文件是否为2010 Build 【发布时间】:2012-09-25 04:02:50 【问题描述】:

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

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

【问题讨论】:

MSDN 的Structure of a Library 页面提到了DUMPBIN 工具从库中提取信息的标志,也许通过该工具您可以找到版本号或其他一些区别信息。跨度> 在lib的内容上,不同的编译器版本使用了不同的名称修饰。 【参考方案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

您会注意到哪个字符串在“.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 部分的真实信息,除了它存在并包含调试信息。

请注意,据我所知,此信息未记录在案,而且我的逆向工程至少可以说是粗略的,并且可能会在所有情况下都发生变化或不成立。我真的不确定这些信息的可靠性,但如果没有其他更好的信息出现,这只是一个开始。

【讨论】:

以上是关于判断一个lib文件是不是为2010 Build的主要内容,如果未能解决你的问题,请参考以下文章

VB2010 如何判断一个数字是不是为整数

win7下为VS2010安装boost库 命令行运行bootstrap.bat时提示failed to build Boost.Build engine

vue-cli-service build --target lib 导入为 lib 时丢失图像路径

如何以及何时使用“ng build”生成的 lib 文件夹的 esm5 和 esm2015 目录?

MyEclipse的 lib和Build path(构建路径)

eclipse ant build failed 无法删除文件 lib\build