德尔福dcu to obj

时间:2010-09-12 18:12:48

标签: c delphi

有没有办法将Delphi .dcu文件转换为.obj文件,以便可以使用像GCC这样的编译器进行链接?我没有使用Delphi几年,但是如果可能的话,我想再次使用if。

5 个答案:

答案 0 :(得分:14)

Delphi可以输出.obj文件,但它们是32位的Intel OMF变体。另一方面,GCC与ELF(Linux,大多数Unix),COFF(在Windows上)或Mach-O(Mac)一起使用。

但仅凭这一点还不够。在不使用运行时库的情况下编写很多代码很困难,并且运行时库的实现将依赖于编译器和链接器体系结构的低级细节,例如正确的初始化顺序。

此外,兼容性不仅仅是目标文件格式;特别是Linux上的代码需要与位置无关,这意味着它不能使用绝对值来引用全局符号,而是必须从寄存器或相对于指令指针索引其所有全局数据,以便代码可以在内存中重新定位而无需重写引用。

DCU文件是Delphi符号表的序列化和为每个proc生成的代码,因此高度依赖于编译器的实现细节,编译器从一个版本更改为下一个版本。

所有这一切都是说你不可能将很多Delphi(dcc32)代码链接到GNU环境中,除非你把自己局限于绝对最少的非托管数据类型(没有字符串,没有接口)和过程代码(没有类,没有初始化部分,没有需要初始化的数据等)

答案 1 :(得分:4)

是。查看“项目选项”对话框:

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

答案 2 :(得分:4)

(回答各种FPC评论,但我需要更多空间)

为了更好地理解,你必须知道delphi .dcu转换为两个不同的FPC文件,带有上述symtable内容的.ppu文件,其中包括非链接代码,如内联函数和泛型定义,以及.o,它是Windows上的mingw compatible(COFF)。 Cygwin在链接级别上也兼容(但运行时不同且可怕)。无论如何,mingw32 / 64是我们在Windows上的参考gcc。

PPU与Delphi的DCU有类似的版本问题,原因可能相同。 ppu格式几乎与每个主要版本不同。 (所以2.0,2.2,2.4),并且主干每年通常改变2-3次

因此,虽然Windows上的FPC使用自己的汇编程序和链接器,但它生成的.o仍然与mingw32兼容。通常,FPC的输出非常兼容gcc,并且通常可以直接链接到gcc静态库中,例如, mysql和postgres linklibs链接到具有合适许可证的应用程序。 (例如GPL)在64位上它们也应该兼容,但这可能不如win32测试。

textmode IDE甚至以库的形式链接整个GDB调试器。 GDB是Windows上gcc兼容性的主要原因之一。

虽然Barry关于运行时的观点一般也适用于FPC,但解决这个问题可能会稍微容易一些。它可能只需要调用某些函数来从您的启动代码初始化FPC rtl,并且类似于最终化。使用-al编译最小FPC程序并查看生成的汇编程序(在.s文件中,最值得注意的是initializeunits和finalizeunits)此外,RTL更灵活,可能更容易减少到最小值。

当然,只要你还需要例外工作来跨越gcc< - > fpc bounderies,你就不走运了。 FPC不使用SEH,也不使用任何与ATM相关的方案。 (与使用SEH的Delphi相反,至少在理论上应该给你一个优势,Barry?)OTOH,gcc可能会使用自己的libunwind而不是SEH。

请注意,x86上FPC的默认调用约定是Delphi兼容寄存器,因此您可能需要插入适当的cdecl(应该是gcc兼容)修饰符,或者甚至可以使用{$ calling一次设置整个单元CDECL}

On * nix这是bog标准(例如apache模块),我不知道很多人在win32上这样做。

关于兼容性; FPC可以编译Indy,Teechart,Zeos,ICS,Synapse,VST等软件包 并且很少或没有mods。释放版本的方言级别是D7及以上的混合,重点是D7。在行李箱版本中,方言等级正逐渐爬升至D2006级别。 (用于,类抽象等)

答案 3 :(得分:2)

据我所知,Delphi仅支持OMF目标文件格式。您可能需要尝试对象格式转换器,例如Agner Fog's

答案 4 :(得分:1)

由于DCU格式是专有的并且倾向于从一个版本的Delphi更改为下一个版本,因此可能没有可靠的方法将DCU转换为OBJ。根据Andreas的回答,你最好的选择是首先用OBJ格式构建它们。