2009-06-08 2 views
12

Недавно я поддерживал старый проект, написанный на VC++ 6.0. В коде используется так много уникальных характеристик этого компилятора, что перенос его на более современный стандартный компилятор оказался задачей геркулеса.В чем разница между форматом OMF и COFF?

Среди тысяч строк кода в проекте есть четыре ассемблерных файла. По какой-то причине я не понимаю, и MASM615 и TASM не могут их скомпилировать (они отправляют ошибки), тем не менее у меня есть объектные файлы. Однако, когда я связать библиотеку я получаю сообщение

предупреждение LNK4033: преобразование формата объекта из OMF в COFF

Библиотека работает, как ожидалось, но я интересно, что различия между этими бинарная форматы, или если я должен ожидать от этого преобразования что-то уродливое.

+1

Взгляните на http://www.iecc.com/linker/linker03.html. – avakar

+0

@avakar: почему бы не вылить эту ссылку в правильный ответ? – xtofl

ответ

14

Ответ порезал из «MetaWINDOW FAQ - OMF против COFF Formats.htm файла Объект»

Испокон PC цивилизации вплоть до о времени Microsoft Win32 средства программирования пришли вместе, почти все компиляторы ПК производятся объектные файлы с использованием стандарта Intel Object Module Format (OMF). Позже Intel представила 386 процессоров и 32-битный защищенный режим, после чего они также расширили спецификацию OMF для 32-разрядных версий, что привело к «OMF-386», который стал стандартом для большинства сред с защищенным режимом ПК. Примерно в это же время оригинальная команда разработчиков Windows NT также разрабатывала код не только для процессоров Intel, но и для поддержки процессоров других производителей. Команда Microsoft NT выбрала более переносимый формат объектного модуля, известный как формат общих файлов объектов (COFF), полученный из официального формата объектного кода для UNIX System V. Объектные модули COFF впоследствии стали стандартом дефакто для всех инструментов разработки Microsoft Win32 и получили преимущество в том, чтобы быть намного ближе в формате Portable Executable files - собственный исполняемый формат для Win32 (у компоновщика в формате COFF гораздо меньше работы для создания 32-разрядной EXE или DLL из файла COFF, чем из файла формата OMF).

Так же, как и объектные файлы OMF- и COFF-формата (.obj's), существуют также файлы библиотеки формата OMF и COFF (.lib). К счастью, библиотеки - это всего лишь коллекция объектных файлов, а также информация заголовка, которая позволяет компоновщику определять, какие файлы объектов использовать из библиотеки. Однако, чтобы сделать все сложнее, и OMF, и COFF используют те же расширения имен файлов, .obj и .lib, чтобы ссылаться на два разных типа форматов файлов объектов и библиотек (из-за этого вы не можете просто посмотреть на расширение имени файла чтобы определить, является ли объектным модулем или библиотечным файлом OMF или COFF).

Проблема с перемещением объектных файлов и файлов библиотек от разных поставщиков компиляторов заключается в том, что некоторые поставщики поддерживают COFF, другие производители используют OMF, а некоторые могут обрабатывать оба. Например, Borland по-прежнему использует объектные файлы и библиотеки OMF, в то время как 32-разрядные компиляторы Microsoft создают файлы формата COFF. Watcom C/C++ v11.0, похоже, предпочитает COFF при компиляции и связывании приложений Windows, но генерирует объектные файлы OMF для использования с DOS-расширителем DOS4GW с 32-битным защищенным режимом. Наряду с этим, Microsoft MASM 6.13 создает файлы OMF по умолчанию, но вместо этого переключатель/coff может испускать объектные файлы COFF.

Когда приходит время связывать файлы с различными форматами, разные компоновщики делают разные вещи. Например, компоновщик Microsoft Visual C/C++ предназначен для объектных файлов и библиотек формата COFF, но при необходимости попытается преобразовать объектные файлы OMF в файлы COFF. Это работает в некоторых случаях, но, к сожалению, Microsoft LINK не поддерживает все типы записей OMF, поэтому во многих ситуациях компоновщик может по-прежнему терпеть неудачу при предоставлении объектных файлов формата OMF. Кроме того, хотя Microsoft LINK пытается поддерживать объектные файлы OMF, он откажется обрабатывать любые библиотеки формата OMF.Другие линкеры, такие как TLINK Borland, предназначены для объектных файлов OMF и аналогичным образом отказываются работать с объектами или файлами формата COFF. Некоторые разработчики DOS и встроенные системные поставщики, такие как Phar Lap, предоставляют свои собственные линкеры, которые поддерживают как OMF, так и COFF, что дает вам выбор.

Суть в том, что смешивание объектов OMF и COFF и типов файлов библиотеки может быть беспорядком (плюс критические сообщения об ошибках от компоновщиков не помогают). Если ваш компоновщик не поддерживает его, вы должны придерживаться рекомендуемого формата объекта и библиотеки для своего компилятора/компоновщика/платформы и избегать смешивания файлов OMF и COFF.

+0

Суть в том, что _his_ компоновщик делает преобразование. Он не генерирует ошибку. – xtofl

+0

Но не все преобразования идут гладко. Если они представляют собой ошибки во время выполнения или сбои функций, посмотрите на этот lib или obj или obj внутри lib frist. Или, конечно, все может быть хорошо. – kingchris

+0

Должны ли все компоновщики создать исполняемый файл PE-COFF в конце для его запуска на платформе Windows? То есть после процесса связывания конечный исполняемый файл содержит данные и структуру, специфичные для другого формата объекта, например. OMF? И если да, то как это работает? (или как * может * это работает?) – greatwolf

Смежные вопросы