2009-06-08 10 views
12

Kürzlich habe ich ein Legacy-Projekt in VC++ 6.0 geschrieben. Der Code verwendet so viele einzigartige Eigenschaften dieses Compilers, dass die Portierung auf einen neueren Standard-Compiler eine herkulische Aufgabe ist.Was ist der Unterschied zwischen dem OMF- und dem COFF-Format?

Unter den Tausenden Zeilen Code in das Projekt gibt es vier Assembler-Dateien. Aus irgendeinem Grund verstehe ich nicht, weder MASM615 noch TASM können sie kompilieren (sie senden Fehler), trotzdem habe ich die Objektdateien. Allerdings, wenn ich die Bibliothek verknüpfen erhalte ich eine Nachricht

Warnung LNK4033: Umwandlung Objektformat von OMF zu COFF

Die Bibliothek funktioniert wie erwartet, aber ich habe mich gefragt, was die Unterschiede zwischen diesen binären ist Formate, oder wenn ich etwas Hässliches von dieser Konvertierung erwarten sollte.

+1

Werfen Sie einen Blick auf http://www.iecc.com/linker/linker03.html. – avakar

+0

@avakar: warum nicht diesen Link in eine richtige Antwort gießen? – xtofl

Antwort

14

Antwort aus geklaut „MetaWINDOW FAQ - OMF vs COFF Object File Formats.htm“

Seit den Anfängen der PC Zivilisation bis etwa zu der Zeit Microsoft Win32-Programmierwerkzeuge kam, fast alle PC-Compiler erzeugten Objektdateien Verwenden des Intel-Objektmodul-Format-Standards (OMF). Später führte Intel 386 Prozessoren und einen 32-Bit-Protected-Modus ein und erweiterte dann die OMF-Spezifikation für 32-Bit, was zu "OMF-386" führte, das zum Standard für die meisten PC-Protected-Mode-Umgebungen wurde. Ungefähr zur gleichen Zeit entwarf das ursprüngliche Windows NT-Entwicklungsteam Code, nicht nur für Intel-Prozessoren, sondern auch für die Unterstützung von Prozessoren anderer Hersteller. Das Microsoft NT-Team ausgewählt, um ein tragbaren Objektmodul-Format als Common Object File Format (COFF) bekannt aus dem Format offiziellen Objekt-Code abgeleitet für UNIX System V COFF Objektmodule später der Defacto-Standard für alle Microsoft Win32-Entwicklungs-Tools wurde, und gewonnen ein Vorteil sein viel näher in Format Portable Executable-Dateien - die native ausführbare Format für Win32 (ein COFF-Format Linker hat viel weniger Arbeit ein 32-Bit-EXE oder DLL aus einer COFF Datei als von einer OMF-Format-Datei zu erstellen).

So wie es OMF- und COFF-Format Objektdateien (OBJ ist), gibt es auch OMF und COFF Format Bibliotheksdateien (LIB ist). Die Bibliotheken sind glücklicherweise im Grunde nur eine Sammlung der Objektdateien, zusammen mit einigen Header-Informationen, mit denen der Linker bestimmen kann, welche Objektdateien aus der Bibliothek zu verwenden sind. aber um die Dinge schwierig, sowohl OMF und COFF den gleichen Dateinamenerweiterungen verwenden, OBJ und LIB, die zwei verschiedenen Arten von Objekten und Bibliotheksdateiformaten zu verweisen (aus diesem Grunde kann man nicht nur auf der Dateinamenerweiterung aussehen um festzustellen, ob das Objektmodul oder die Bibliotheksdatei OMF oder COFF ist).

Das Problem mit dem Mischen von Objektdateien und Bibliotheksdateien von verschiedenen Compiler-Anbietern ist, dass einige Anbieter COFF unterstützen, andere Hersteller OMF verwenden, und einige können beide verarbeiten. Borland zum Beispiel verwendet weiterhin OMF-Objektdateien und -Bibliotheken, während die 32-Bit-Compiler von Microsoft COFF-Formatdateien erzeugen. Watcom C/C++ v11.0 scheint COFF beim Kompilieren und Verknüpfen von Windows-Anwendungen vorzuziehen, generiert jedoch OMF-Objektdateien zur Verwendung mit ihrem DOS4GW 32-Bit-DOS-Extender mit geschütztem Modus. Zusammen mit diesem erzeugt Microsoft MASM 6.13 standardmäßig OMF-Dateien, aber mit dem Schalter/coff können stattdessen COFF-Objektdateien ausgegeben werden.

Wenn es darum geht, Dateien mit verschiedenen Formaten zu verbinden, haben unterschiedliche Linker differnt Dinge. Beispielsweise ist der Microsoft Visual C/C++ - Linker für COFF-Format-Objektdateien und -Bibliotheken konzipiert, versucht jedoch, OMF-Objektdateien bei Bedarf in COFF-Dateien umzuwandeln. Dies funktioniert in einigen Fällen, aber leider unterstützt Microsoft LINK nicht alle OMF-Record-Typen, so dass der Linker in vielen Situationen immer noch fehlschlägt, wenn OMF-Format-Objektdateien übergeben werden. Auch wenn Microsoft LINK versucht, OMF-Objektdateien zu unterstützen, lehnt es die Verarbeitung von OMF-Formatbibliotheken ab.Andere Linker, wie Borlands TLINK, sind für OMF-Objektdateien vorgesehen und verweigern in ähnlicher Weise die Arbeit mit COFF-Format-Objekt- oder Bibliotheksdateien. Einige Hersteller von DOS-Extendern und Embedded-Systemen wie Phar Lap stellen ihre eigenen Linker zur Verfügung, die sowohl OMF als auch COFF unterstützen und Ihnen eine Auswahlmöglichkeit bieten.

Die Quintessenz ist, dass das Mischen von OMF und COFF Objekt und Bibliothek Dateitypen ein Durcheinander sein kann (plus die kryptischen Fehlermeldungen von den Linkern nicht helfen). Sofern Ihr Linker dies nicht ausdrücklich unterstützt, sollten Sie das empfohlene Objekt- und Bibliotheksformat für Ihren Compiler/Linker/Ihre Plattform einhalten und vermeiden, OMF- und COFF-Dateien zu mischen.

+0

Die untere Zeile scheint eher, dass _his_ Linker die Konvertierung ausführt. Es erzeugt keinen Fehler. – xtofl

+0

Aber nicht alle Konvertierungen laufen reibungslos. Wenn sie irgendwelche Laufzeitfehler oder Funktionsfehler sind, dann sieh dir diese lib oder obj oder obj in einer lib-Datei an. Oder natürlich könnte alles gut gehen. – kingchris

+0

Müssen alle Linker am Ende eine ausführbare PE-COFF-Datei erstellen, damit sie auf einer Windows-Plattform ausgeführt werden kann? Das heißt, nach dem Verknüpfungsvorgang kann die fertig erstellte ausführbare Datei Daten und Struktur enthalten, die für ein anderes Objektformat spezifisch sind, z. OMF? Und wenn ja, wie geht das? (oder wie * kann * das funktionieren?) – greatwolf

Verwandte Themen