Question

Récemment, j'ai un projet maintenais héritage écrit en VC ++ 6.0. Le code utilise tant de caractéristiques uniques de ce compilateur que le portage à un compilateur standard plus récent est avéré être une tâche herculéenne.

Parmi les milliers de lignes de code du 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), cependant je les fichiers objet. Cependant, quand je lie la bibliothèque, je reçois un message

  

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

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

Était-ce utile?

La solution

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

Depuis l'aube de la civilisation PC jusqu'à sur le temps des outils de programmation Microsoft Win32 est venu, presque tous les compilateurs PC produits fichiers objet à l'aide du module Intel Object Format (OMF) standard. Par la suite, Intel a introduit 386 processeurs et en mode protégé 32 bits à quel point ils ont également élargi la spécification OMF pour 32 bits, ce qui conduit à « OMF-386 », qui est devenu la norme pour la plupart des PC environnements en mode protégé. Autour de ce même temps, l'équipe de développement de Windows NT d'origine a été également le code la conception, non seulement pour les processeurs Intel, mais aussi pour soutenir 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 objets COFF-format (.obj de), il y a aussi des fichiers de bibliothèque format OMF et COFF (.lib de). Les bibliothèques, heureusement, sont fondamentalement juste une collection des fichiers objets, ainsi que des informations d'en-tête qui permet à l'éditeur de liens déterminer quels sont les fichiers objet à utiliser dans la bibliothèque. Pour rendre les choses difficiles cependant, à la fois OMF et COFF utilisent les mêmes extensions de nom de fichier, .obj et .lib, pour référencer les deux différents types de formats d'objets et de fichiers de bibliothèque (à cause de cela, vous ne pouvez pas regarder juste à l'extension de nom de fichier pour savoir si le fichier module objet ou d'une 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 des fichiers d'objets OMF et les bibliothèques, alors 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 de lier des applications Windows, mais génère des fichiers d'objet OMF pour une utilisation avec leur DOS4GW en mode protégé 32 bits DOS-extension. 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, Microsoft Visual C / éditeur de liens C est conçu pour des fichiers objets COFF format et les bibliothèques, mais essayer de convertir les fichiers objet OMF dans des fichiers COFF si nécessaire. Cela fonctionne dans certains cas, mais malheureusement Microsoft LINK ne supporte pas tous les types d'enregistrement OMF, donc dans de nombreux cas, l'éditeur de liens peut encore échouer lorsque donné fichiers objet de format OMF. Aussi pendant que Microsoft tente LINK un soutien pour les fichiers objet OMF, il refusera de traiter toutes les bibliothèques de format OMF. D'autres linkers, comme le TLink de Borland, sont conçus pour les fichiers objet OMF et refuseront de travailler de la même avec l'objet COFF format ou des fichiers de bibliothèque. Certains extension DOS et les fournisseurs systèmes embarqués, tels que Phar Lap, fournissent leurs propres linkers qui soutiennent à la fois OMF et COFF, vous donnant un choix.

La ligne de fond est que le mélange des types de fichiers objet et de la bibliothèque OMF et COFF peut être un gâchis (plus les messages d'erreur énigmatiques des linkers ne contribuent pas). À moins que votre agent de liaison prend spécifiquement en charge, vous devez coller avec un objet recommandé et le format de la bibliothèque pour votre compilateur / éditeur de liens / plate-forme, et éviter de mélanger des fichiers OMF et COFF.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top