3

C++ ソースを VS2008 から VS 2010 に移行しています。不適切な lib ファイルが原因で問題が発生しています。

lib ファイルが VS 2010 または VS 2008 を使用してビルドされているかどうかを判断する方法はありますか?

4

1 に答える 1

1

厳密に言えば、lib ファイルから直接取得することはできません。これは、.obj ファイル (または、インポート ライブラリの場合は「疑似オブジェクト ファイル」) の単なるコンテナーであるためです。さまざまなコンパイラによって作成されたオブジェクト ファイルを含むライブラリを使用することは可能ですが、それを頻繁に目にすることはないと思います。

ただし、ライブラリに含まれるオブジェクト ファイルから情報を引き出すことができる場合があります。

この情報の信頼性はわかりませんが、MSVC によって作成されたオブジェクト ファイルには、ビルドに使用されたコンパイラに関するバージョン情報が含まれているようです。オブジェクト ファイルには、「.debug$S」という名前のセクションがあり、デバッグ情報が含まれます。ただし、デバッグ情報なしでオブジェクト ファイルをビルドした場合でも、小さな ".debug$S" セクションが残ります。VS 2008 SP1 (Compilerバージョン 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 ビットの 16 進数に変換すると、次のようになることに注意してください (リトル エンディアンで表示)。

0f 00 00 00 09 78 01 00

これは、「.debug$S」セクションのオフセット 0x30 と 0x38 に 2 回表示される文字列です。

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 2012 コンパイラを介して VS 2003 によって生成されます (VC6 は「.debug$S」セクションを生成せず、VS 2002 をテストする手段がありません)。ただし、情報のオフセットは時々異なります (実際に使用されるオプションとコンパイルされるファイルによっては、同じコンパイラでも異なる場合があります)。

libこの情報を簡単に抽出できるツールは知りませんが、ツールをつなぎ合わせたり、dumpbinおそらく非常に簡単にまとめることができる スクリプトがいくつかあります。Microsoft の「PE および COFF 仕様」ドキュメントは、ライブラリとオブジェクト ファイルを自分で分解したい場合に役立つかもしれませんが、このドキュメントには.debug$Sセクションが存在し、デバッグ情報が含まれていること以外に、セクションに関する実際の情報はありませんでした。

私が知る限り、この情報は文書化されておらず、私のリバース エンジニアリングは控えめに言っても大雑把であり、変更されるか、すべての状況に当てはまるとは限らないことに注意してください。この情報がどれほど信頼できるかは本当にわかりませんが、他に良い情報が表示されない場合はそれが始まりです.

于 2012-09-25T06:16:26.260 に答える