Преобразование файла COFF lib в формат OMF
Есть ли способ конвертировать библиотеку COFF (файл lib) в библиотеку OMF для использования с C++Builder6? Этот coff - не просто библиотека импорта, он содержит некоторый код. Когда я пытаюсь конвертировать его с помощью borland's coff2omf.exe, я получаю файл размером 1 КБ из файла размером 15 КБ.
5 ответов
Весьма типично, что объектный файл OMF намного меньше, чем эквивалентный объект COFF, поэтому то, что вы получаете, вполне может быть действительным.
Если вы обнаружите, что на самом деле это не так, вы, вероятно, можете разбить файл lib на отдельные объектные файлы, разобрать объектные файлы, повторно собрать их в объектные файлы OMF и собрать их вместе в файл lib OMF.
Вместо конвертера DigitalMars вы можете использовать конвертер файлов объектов, доступный по адресу http://agner.org/optimize
Эта утилита может использоваться для преобразования объектных файлов между форматами COFF/PE, OMF, ELF и Mach-O для всех 32-разрядных и 64-разрядных платформ x86. Может изменять имена символов в объектных файлах. Может создавать, изменять и конвертировать библиотеки функций на разных платформах. Может дамп объектных файлов и исполняемых файлов. Также включает в себя очень хороший дизассемблер, поддерживающий наборы инструкций SSE4, AVX, AVX2, FMA и XOP. Исходный код включен (GPL).
Это отличный сайт для низкоуровневой оптимизации, и в соответствующем pdf-файле руководства много полезной информации о форматах библиотек на нескольких платформах.
Это довольно поздно, но если кто-то ищет ответ, вы можете проверить COFFIMPLIB от DigitalMars. COFF2OMF доступен на том же сайте, но, похоже, он старше.
Интеграция Delphi (omf) и Ada (gcc, coff) требовала больших усилий, пока я не прекратил делать это в одном exe.
Я честно пытался разложить gcc rtl и ada rtl .a (библиотеки coff) на множество.o (объектов), преобразовать их через coff2omf (были DMD coff2omf и iirc еще один convobj или около того). Некоторые из coff.o не удалось преобразовать в.obj, поэтому я не могу сказать, был ли это надежный способ вообще.
Преобразование уровня ассемблера не так просто, когда дело доходит до исключений и других глубоких деталей.
Жаль, что я не пробовал инструмент с именем ftp://ftp.styx.cabel.net/pub/UniLink/
Это не очевидно, но UniLink, вероятно, может быть использован для достижения цели. Одной из его целей является пакет C++ Builder (как динамический, так и статический). unilink -Tpp -GI должен сделать свое дело
Возможно, стоит заметить, что в более новых версиях Delphi (>= XE2) компилятор принимает как COFF, так и OMF. Это, вероятно, также верно для C++ Builder. 64-битные компиляторы используют только COFF. Смотрите здесь для получения дополнительной информации о связывании COFF.