Delphi dcu to obj - PullRequest
       3

Delphi dcu to obj

5 голосов
/ 12 сентября 2010

Есть ли способ преобразовать файл Delphi .dcu в файл .obj, чтобы его можно было связать с помощью компилятора, такого как GCC? Я не пользовался Delphi пару лет, но хотел бы использовать его снова для проекта, если это возможно.

Ответы [ 5 ]

14 голосов
/ 12 сентября 2010

Delphi может выводить файлы .obj, но они находятся в 32-разрядном варианте Intel OMF. GCC, с другой стороны, работает с ELF (Linux, большинство Unixes), COFF (в Windows) или Mach-O (Mac).

Но одного этого недостаточно. Трудно написать много кода без использования библиотеки времени выполнения, и реализация библиотеки времени выполнения будет зависеть от низкоуровневых деталей архитектуры компилятора и компоновщика, например, от правильного порядка инициализации.

Более того, совместимость не только в формате объектного файла; в частности, код в Linux должен быть независимым от позиции, что означает, что он не может использовать абсолютные значения для ссылки на глобальные символы, а должен индексировать все свои глобальные данные из регистра или относительно указателя инструкций, чтобы код может быть перемещен в память без перезаписи ссылок.

Файлы DCU являются сериализацией таблиц символов Delphi и кода, сгенерированных для каждого процесса, и, таким образом, сильно зависят от деталей реализации компилятора, который изменяется от одной версии к следующей.

Все это означает, что маловероятно, что вы сможете получить много Delphi (dcc32) кода, связывающего со средой GNU, если вы не ограничите себя абсолютным минимумом неуправляемых типов данных (без строк, без интерфейсы) и процедурный код (без классов, без секции инициализации, без данных, требующих инициализации и т. д.)

4 голосов
/ 14 сентября 2010

(ответ на различные замечания FPC, но мне нужно больше места)

Для хорошего понимания, вы должны знать, что delphi .dcu преобразуется в два разных файла FPC, файл .ppu с упомянутой symtableвещи, которые включают в себя несвязываемый код, такой как встроенные функции и общие определения, и .o, который совместим с MINGW (COFF) в Windows.Cygwin также совместим с mingw на уровне связывания (но время выполнения отличается и страшно).В любом случае, mingw32 / 64 является нашим эталонным gcc для Windows.

У PPU такая же проблема с версией, что и у DC Delphi, вероятно, по тем же причинам.Формат ppu отличается практически во всех основных выпусках.(то есть 2.0, 2.2, 2.4), и обычно меняется 2-3 раза в год в транке

Так что, хотя FPC в Windows использует собственные ассемблеры и компоновщики, генерируемые им файлы .o по-прежнему совместимы с mingw32. В целомВыходные данные FPC очень совместимы с gcc, и часто можно напрямую связать их со статическими библиотеками gcc, что позволяет, например, связывать библиотеки ссылок mysql и postgres в приложения с подходящей лицензией.(например, GPL). На 64-битном уровне они также должны быть совместимы, но это, вероятно, менее проверено, чем win32.

Текстовая среда IDE даже связывает весь отладчик GDB в виде библиотеки.GDB является одной из основных причин совместимости gcc в Windows.

Хотя замечания Барри о времени выполнения в целом верны и для FPC, возможно, будет немного легче обойти это.Это может потребовать вызова только определенных функций для инициализации FPC RTL из вашего кода запуска, и аналогично для финализации.Скомпилируйте минимальную программу FPC с помощью -al и просмотрите получившийся ассемблер (в файле .s, прежде всего, initializeunits и finalizeunits). Более того, RTL более гибок и, вероятно, легче сократить до минимума.

Конечнокак только вам также потребуются исключения для работы в пределах gcc <-> fpc, вам не повезло.FPC не использует SEH или какую-либо схему, совместимую с другими банкоматами.(в отличие от Delphi, который использует SEH, который, по крайней мере, теоретически должен дать вам преимущество, Барри?) OTOH, gcc может использовать свой собственный libunwind вместо SEH.

Обратите внимание, что соглашение о вызовах по умолчанию FPCна x86 есть Delphi-совместимый регистр, поэтому вам может понадобиться вставить соответствующие модификаторы cdecl (которые должны быть gcc-совместимыми) или даже установить их для целых модулей за один раз, используя {$ вызывает cdecl}

On * nixэто стандартный стандарт (например, модули apache), хотя я не знаю многих людей, которые делают это на win32.

О совместимости;FPC может компилировать пакеты, такие как Indy, Teechart, Zeos, ICS, Synapse, VST и более, с минимальными модами или без них.Уровни диалекта выпущенных версий - смесь D7 и выше, с акцентом на D7.Уровень диалекта медленно сползает к уровню D2006 в версиях магистрали.(с for in, аннотация класса и т. д.)

4 голосов
/ 12 сентября 2010

Да.Взгляните на диалоговое окно параметров проекта:

http://privat.rejbrand.se/prooptions.png
(High-Res)

2 голосов
/ 12 сентября 2010

Насколько мне известно, Delphi поддерживает только формат объектных файлов OMF.Вы можете попробовать преобразователь формата объекта, например Agner Fog's .

1 голос
/ 12 сентября 2010

Поскольку формат DCU является проприетарным и имеет тенденцию переходить с одной версии Delphi на другую, вероятно, нет надежного способа конвертировать DCU в OBJ. Лучше всего в первую очередь построить их в формате OBJ, согласно ответу Андреаса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...