2009-06-08 125 views
12

最近私はVC++ 6.0で書かれたレガシープロジェクトを維持してきました。このコードでは、このコンパイラの非常に多くの独自の特性が使用され、より最近の標準コンパイラに移植することは難題です。OMF形式とCOFF形式の違いは何ですか?

プロジェクトの数千行のコードのうち、4つのアセンブラファイルがあります。なんらかの理由で私は理解できませんし、MASM615もTASMもそれらをコンパイルできません(エラーを送信します)。しかし、私はオブジェクトファイルを持っています。私は、ライブラリをリンクするときしかし、私はメッセージ

警告LNK4033を取得:予想通りのライブラリ作品COFF

にOMFから

をオブジェクト形式を変換するが、私はこれらのバイナリの間に何の違いを思ってきましたまたは私がこの変換から何か醜いものを期待するべきかどうかを判断する必要があります。マイクロソフトWin32プログラミングツールは、に沿ってオブジェクトファイルを生成し、ほぼすべてのPCのコンパイラを来た頃PC文明の夜明けアップまでので

- 「COFFオブジェクト・ファイルFormats.htm対OMF MetaWINDOWよくある質問」のうち、ニックを有する

+1

http://www.iecc.com/linker/linker03.htmlをご覧ください。 – avakar

+0

@avakar:そのリンクを適切な答えに入れてみませんか? – xtofl

答えて

14

回答Intel Object Module Format(OMF)標準を使用しています。その後Intelは386プロセッサと32ビット保護モードを導入し、その時点で32ビットのOMF仕様を拡張し、ほとんどのPC保護モード環境の標準となった「OMF-386」に導いた。同時期に、元のWindows NT開発チームは、Intelプロセッサだけでなく、他のベンダのプロセッサもサポートするようにコードを設計していました。 Microsoft NTチームは、UNIX System Vの公式のオブジェクトコード形式から派生したCOFF(Common Object File Format)というより移植性の高いオブジェクトモジュール形式を選択しました。COFFオブジェクトモジュールは、後ですべてのMicrosoft Win32開発ツールの標準規格となり、 Win32用のネイティブの実行可能形式(COFF形式のリンカーは、OMF形式のファイルよりもCOFFファイルから32ビットのEXEまたはDLLを作成する作業がはるかに少なくなっています)のPortable Executableファイルに近い形式の利点があります。

OMFおよびCOFF形式のオブジェクトファイル(.obj)と同様に、OMFおよびCOFF形式ライブラリファイル(.lib)もあります。幸いにも、ライブラリは基本的に単なるオブジェクトファイルのコレクションであり、リンカがライブラリからどのオブジェクトファイルを使用するかを決定するためのヘッダー情報もあります。ただし、OMFとCOFFの両方で同じファイル名拡張子.objと.libを使用すると、2つの異なるタイプのオブジェクトとライブラリファイル形式を参照することができます(このため、ファイル名拡張子オブジェクトモジュールまたはライブラリファイルがOMFかCOFFかどうかを知るため)。

異なるコンパイラベンダーのオブジェクトファイルとライブラリファイルを混在させると、一部のベンダーがCOFFをサポートし、他のベンダーはOMFを使用し、いくつかは両方を処理できます。たとえば、BorlandはOMFオブジェクトファイルとライブラリを使用していますが、Microsoftの32ビットコンパイラはCOFF形式のファイルを生成します。 Watcom C/C++ v11.0は、Windowsアプリケーションのコンパイルとリンク時にはCOFFを優先しますが、DOS4GWの32ビット保護モードDOSエクステンダで使用するOMFオブジェクトファイルを生成します。これに伴い、Microsoft MASM 6.13ではデフォルトでOMFファイルが生成されますが、/ coffスイッチを使用するとCOFFオブジェクトファイルが生成されます。

異なるフォーマットのファイルをリンクするときは、リンカーによって異なるものがあります。たとえば、Microsoft Visual C/C++リンカはCOFF形式のオブジェクトファイルとライブラリ用に設計されていますが、必要に応じてOMFオブジェクトファイルをCOFFファイルに変換しようとします。これは場合によっては機能しますが、残念ながらMicrosoft LINKはすべてのOMFレコードタイプをサポートしていないため、多くの場合、OMFフォーマットオブジェクトファイルが与えられてもリンカが失敗する可能性があります。また、Microsoft LINKはOMFオブジェクトファイルの一部のサポートを試みますが、OMF形式ライブラリの処理を拒否します。BorlandのTLINKなどの他のリンカは、OMFオブジェクトファイル用に設計されており、同様にCOFF形式のオブジェクトまたはライブラリファイルでの動作を拒否します。 Phar Lapなどの一部のDOSエクステンダと組み込みシステムのベンダーは、OMFとCOFFの両方をサポートする独自のリンカを提供しています。

結論は、OMFとCOFFオブジェクトを混在させ、ライブラリファイルの種類が混乱している可能性があることです(リンカのエラーメッセージは役に立ちません)。リンカが特別にサポートしていない限り、コンパイラ/リンカ/プラットフォームの推奨オブジェクトおよびライブラリ形式に固執し、OMFおよびCOFFファイルの混在を避ける必要があります。

+0

結局のところ、_his_リンカが変換を行っているようです。エラーは発生しません。 – xtofl

+0

しかし、すべての変換がスムーズに進むわけではありません。それらがランタイムエラーまたは関数の失敗である場合は、libの中のこのlibまたはobjまたはobjを見てください。もちろん、すべてがうまくいくかもしれません。 – kingchris

+0

すべてのリンカは、Windowsプラットフォーム上で実行するために最後にPE-COFF実行可能ファイルを作成する必要がありますか?つまり、リンク処理の後に、最終的に生成された実行可能ファイルは、別のオブジェクト形式に特有のデータおよび構造体を含むことができる。 OMF?もしそうなら、それはどのように機能しますか? (または、どうすれば*できますか?) – greatwolf

関連する問題