В чем разница между форматом OMF и COFF?

недавно я поддерживал устаревший проект, написанный на VC++ 6.0. Код использует так много уникальных характеристик этого компилятора, что перенос его на более поздний стандартный компилятор оказался геркулесовой задачей.

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

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

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

1 ответов


ответ вырван из " METAWINDOW FAQ - OMF vs COFF форматы объектных файлов.htm"

с рассвета цивилизации ПК до тех пор, пока не появились инструменты программирования Microsoft Win32, почти все компиляторы ПК производили объектные файлы, используя стандарт Intel Object Module Format (OMF). Позже Intel представила 386 процессоров и 32-битный защищенный режим, в котором они также расширили спецификацию OMF для 32-бит, что привело к "OMF-386", который стал стандартом для большинства ПК среды защищенного режима. Примерно в то же время оригинальная команда разработчиков Windows NT также разрабатывала код не только для процессоров Intel, но и для поддержки процессоров других поставщиков. Команда Microsoft NT выбрала более переносимый формат объектных модулей, известный как Common Object File Format (COFF), полученный из официального формата объектного кода для системы UNIX V. объектные модули COFF позже стали стандартом defacto для всех средств разработки Microsoft Win32 и получили преимущество в будучи намного ближе по формату к портативным исполняемым файлам-собственный исполняемый формат для Win32 (компоновщик формата COFF имеет гораздо меньше работы для создания 32-разрядного EXE или DLL из файла COFF, чем из файла формата OMF).

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

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

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

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