Какая разница между форматом OMF и COFF?

Недавно я поддерживал старый проект, написанный на VС++ 6.0. В коде используется так много уникальных характеристик этого компилятора, что перенос его на более современный стандартный компилятор оказался задачей для herculean.

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

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

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

Ответ 1

Отключен ответ "FAQ MetaWINDOW - OMF vs COFF Object File Formats.htm"

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

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

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