2009-06-08 8 views
12

Récemment, j'ai géré un projet hérité écrit en VC++ 6.0. Le code utilise tellement de caractéristiques uniques de ce compilateur que le portage vers un compilateur standard plus récent s'est avéré être une tâche herculéenne.Quelle est la différence entre le format OMF et COFF?

Parmi les milliers de lignes de code dans le projet, il y a quatre fichiers assembleur. Pour une raison que je ne comprends pas, ni MASM615 ni TASM sont capables de les compiler (ils envoient des erreurs), néanmoins j'ai les fichiers objets. Cependant, quand je lie la bibliothèque, je reçois un message

LNK4033 d'avertissement: convertir le format d'objet OMF à COFF

Les travaux de bibliothèque comme prévu, mais je me demandais ce sont les différences entre ces binaires formats, ou si je devrais attendre quelque chose de moche de cette conversion.

+1

Jetez un oeil à http://www.iecc.com/linker/linker03.html. – avakar

+0

@avakar: pourquoi ne pas verser ce lien dans une réponse appropriée? – xtofl

Répondre

14

Réponse entaillé sur « FAQ MetaWINDOW - OMF vs COFF objet fichier Formats.htm »

Depuis l'aube de la civilisation PC jusqu'à environ le temps des outils de programmation Microsoft Win32 est venu, presque tous les compilateurs de PC ont produit des fichiers d'objets en utilisant la norme OMF (Intel Object Module Format). Plus tard, Intel a introduit 386 processeurs et 32 ​​bits en mode protégé, auquel ils ont également étendu la spécification OMF pour 32 bits, conduisant à "OMF-386" qui est devenu la norme pour la plupart des environnements en mode protégé PC. À la même époque, l'équipe de développement Windows NT originale créait également du code, non seulement pour les processeurs Intel, mais également pour prendre en charge les processeurs d'autres fournisseurs. L'équipe Microsoft NT sélectionné un format de module plus d'objet portable connu sous le nom Format de fichier COFF (Common Object) dérivé du format officiel code objet pour les modules d'objets UNIX System V. COFF est devenu plus tard le standard de facto pour tous les outils de développement Microsoft Win32, et a gagné un avantage d'être beaucoup plus proche au format des fichiers Portable executable - le format exécutable natif pour Win32 (un éditeur de liens COFF format a beaucoup moins de travail pour créer un EXE 32 bits ou DLL à partir d'un fichier COFF que d'un fichier de format OMF).

Tout comme il y a des fichiers OMF- et objet COFF-format (des années OBJ), il y a aussi des fichiers de bibliothèque format OMF et COFF (.lib de). Les bibliothèques, heureusement, sont simplement une collection de fichiers d'objets, avec quelques informations d'en-tête qui permettent à l'éditeur de liens de déterminer quels fichiers objets utiliser à partir de la bibliothèque. Pour rendre les choses difficiles, OMF et COFF utilisent les mêmes extensions de nom de fichier, .obj et .lib, pour référencer les deux types de formats de fichiers d'objet et de bibliothèque (pour cette raison, vous ne pouvez pas regarder l'extension de nom de fichier pour dire si le module d'objet ou le fichier de bibliothèque est OMF ou COFF).

Le problème avec le mélange des fichiers objets et des fichiers de bibliothèque de différents fournisseurs de compilateur est que certains fournisseurs prennent en charge COFF, d'autres fournisseurs utilisent OMF, et quelques-uns peuvent gérer à la fois. Borland, par exemple, utilise toujours des fichiers objets et des bibliothèques OMF, tandis que les compilateurs 32 bits de Microsoft produisent des fichiers au format COFF. Watcom C/C++ v11.0 semble préférer COFF lors de la compilation et la liaison des applications Windows, mais génère des fichiers objet OMF pour une utilisation avec leur extension DOS4GW en mode protégé 32 bits. Parallèlement à cela, Microsoft MASM 6.13 produit des fichiers OMF par défaut, mais avec le commutateur/coff peut émettre des fichiers objets COFF à la place.

Quand vient le temps de lier des fichiers avec des formats différents, différents linkers font des choses differnt. Par exemple, le lieur Microsoft Visual C/C++ est conçu pour les fichiers d'objets au format COFF et les bibliothèques, mais essayera de convertir les fichiers objet OMF en fichiers COFF si nécessaire. Cela fonctionne dans certains cas, mais malheureusement, Microsoft LINK ne prend pas en charge tous les types d'enregistrement OMF, de sorte que dans de nombreuses situations, l'éditeur de liens peut toujours échouer lorsqu'il reçoit des fichiers objet au format OMF. Aussi, alors que Microsoft LINK tente de prendre en charge les fichiers objets OMF, il refuse de traiter les bibliothèques au format OMF.D'autres liens, tels que TLINK de Borland, sont conçus pour les fichiers objet OMF et refusent de la même manière de travailler avec des objets ou des fichiers de bibliothèque au format COFF. Certains fournisseurs d'extensions DOS et de systèmes embarqués, tels que Phar Lap, fournissent leurs propres linkers qui prennent en charge à la fois OMF et COFF, ce qui vous donne le choix. En résumé, le fait de mélanger des objets OMF et COFF et des types de fichiers de bibliothèque peut être un gâchis (en plus, les messages d'erreur énigmatiques des linkers n'aident pas). À moins que votre éditeur de liens ne le prenne en charge de manière spécifique, vous devriez conserver l'objet et le format de bibliothèque recommandés pour votre compilateur/éditeur de liens/plate-forme, et éviter de mélanger des fichiers OMF et COFF.

+0

La ligne du bas semble plutôt que _his_ linker fait la conversion. Cela ne génère pas d'erreur. – xtofl

+0

Mais toutes les conversions ne se passent pas bien. S'il y a des erreurs d'exécution ou des échecs de fonction, alors regardez dans lib ou obj ou obj dans une librairie. Ou bien sûr tout pourrait bien se passer. – kingchris

+0

Est-ce que tous les linkers doivent créer un exécutable PE-COFF à la fin pour qu'il s'exécute sur une plateforme Windows? C'est après le processus de liaison que l'exécutable produit final peut contenir des données et une structure spécifiques à un autre format d'objet, par exemple. OMF? Et si oui, comment cela fonctionne-t-il? (ou comment * peut * ça marche?) – greatwolf

Questions connexes