Вопрос

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

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

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

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

Это было полезно?

Решение

Ответ вырезан из «Часто задаваемых вопросов по MetaWINDOW — OMF и COFF Object File Formats.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 System V.Объектные модули COFF позже стали де-факто стандартом для всех инструментов разработки Microsoft Win32 и получили преимущество, поскольку они намного ближе по формату к Portable Executable файлам - собственному формату исполняемых файлов для Win32 (компоновщику формата COFF требуется гораздо меньше работы для создания 32-файлов). -бит EXE или DLL из файла COFF, чем из файла формата OMF).

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top