Каково различие между OMF и форматом COFF?

Вы чаще думаете о классах как об общих, но методы также могут быть общими. Типичным примером является Arrays.asList .

В большинстве случаев вам не нужно использовать синтаксис с угловыми скобками <...>, даже когда вы вызываете универсальный метод, потому что это единственное место, в котором Java-компилятор действительно способен выполнять вывод базового типа в некоторых обстоятельствах. Например, фрагмент, приведенный в документации Arrays.asList, пропускает тип:

List stooges = Arrays.asList("Larry", "Moe", "Curly");

Но это эквивалентно этой версии, в которой универсальный тип задан явно:

List stooges = Arrays.asList("Larry", "Moe", "Curly");

12
задан menjaraz 16 February 2012 в 10:39
поделиться

1 ответ

Ответ выделен из "MetaWINDOW FAQ - 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 выбрала более переносимый формат объектных модулей, известный как 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.

14
ответ дан 2 December 2019 в 21:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: