3

.objリンク時のコード生成オプションで生成されたファイルから、Visual Studio のバージョン (2002/2003、2005、2008、2010、2012、2013、2015) を特定しようとしています。

私が持っている、MSVC2012 で生成されたファイルには、次の COFF ヘッダーの内容があります。

                File Header
+0  00 00       Machine - Unknown Machine
+2  FF FF       NumberOfSections
+4  01 00 4C 01 TimeDateStamp
+8  70 94 F9 55 PointerToSymbolTable
+12 38 FE B3 0C NumberOfSymbols
+16 A5 D9       SizeOfOptionalHeader
+18 AB 4D       Characteristics
                Optional Header
+20 AC 9B       Magic
+22 D6 B6       Linker Version Major/Minor

最初の 4 バイトが 00,00,FF,FF であることが LTCG オブジェクトとしてマークされているようで、その後に続くのは独自のものです。通常のファイルヘッダーメンバーはどれも「意味がありません」(タイムスタンプは問題ないかもしれませんが、私は確認しませんでした)。

このヘッダーの一部がコンパイラ固有のものであるかどうかを知っている人はいますか? 私が決定する必要があるのは、オブジェクトのコンパイルに使用された MSVC メジャー バージョンだけです...

としてコード化されたバージョンが<MAJOR:16:LE> 0x80 <MINOR:16:LE>ヘッダーの直後に保存されているようです。例えば:

17.00.61030 -> 0x11.0xEE66 -> 11 00 80 66 EE
19.00.23026 -> 0x13.0x59F2 -> 13 00 80 F2 59

必要なのは、前のデータからのオフセットによって確実に到達する方法を理解することです。

これは関連する質問であり、解決策はありません...

4

1 に答える 1

1

TL,DR :
このファイル形式ではコンパイラのバージョンを取得できないと思います...

完全な答え:

「winnth.h」にさまざまな構造で記述されている「匿名ファイル形式」のバリエーションのように見えます(またはでANON_OBJECT_HEADER_XXX置き換えXXXてください)。winnt.hにある のコピーを次に示します。V2BIGOBJANON_OBJECT_HEADER_BIGOBJ

typedef struct ANON_OBJECT_HEADER_BIGOBJ {
    /* same as ANON_OBJECT_HEADER_V2 */
    WORD    Sig1;            // Must be IMAGE_FILE_MACHINE_UNKNOWN
    WORD    Sig2;            // Must be 0xffff
    WORD    Version;         // >= 2 (implies the Flags field is present)
    WORD    Machine;         // Actual machine - IMAGE_FILE_MACHINE_xxx
    DWORD   TimeDateStamp;
    CLSID   ClassID;         // CLSID is a 16 bytes struct  (not original comment)
    DWORD   SizeOfData;      // Size of data that follows the header
    DWORD   Flags;           // 0x1 -> contains metadata
    DWORD   MetaDataSize;    // Size of CLR metadata
    DWORD   MetaDataOffset;  // Offset of CLR metadata
    /* bigobj specifics */
    DWORD   NumberOfSections; // extended from WORD
    DWORD   PointerToSymbolTable;
    DWORD   NumberOfSymbols;
} ANON_OBJECT_HEADER_BIGOBJ;</code>

説明の一致:

Sig1 :    00 00
Sig2 :    FF FF
Version : >=2
Machine : 0x14c`

他のヘッダー構造 (つまりANON_OBJECT_HEADERANON_OBJECT_HEADER_V2) は基本的に同じですが、フィールドが少なくなっています。フィールド
については、ここでいくつかの情報を見つけました: http://www.geoffchappell.com/studies/msvc/link/dump/infiles/obj.htmVersion

匿名ファイルのVersionフィールドは「1」のように見え、匿名ファイルといわゆる「インポートファイル」は同じ特性を共有しているように見えますがVersion = 0、インポートファイル形式のみです(確かに何であるかはわかりません)。

しかし、ええ、ヘッダーを見るだけでは、使用されたコンパイラのバージョンに関する情報がないようです。それでも、/GL スイッチを使用して生成された .obj ファイルを見ると、この形式に厳密に従っているわけではなく、それらに関する情報はあまり見つかりませんでした。誰かが私が間違っていることを証明してくれるとうれしいです.

于 2015-11-29T11:28:00.100 に答える