【问题标题】:Delphi dcu to objDelphi dcu转obj
【发布时间】:2010-09-12 18:12:47
【问题描述】:

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

【问题讨论】:

  • 转换是唯一的方法吗?包装器呢?
  • 您建议使用哪种包装器?
  • 我以为你没有 .pas(只有 .dcu),如果你看一下 FreePascal 编译器的 -A 选项(ELF、COFF 等),那将简单很多

标签: c delphi


【解决方案1】:

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

但仅此还不够。不使用运行时库很难编写大量代码,运行时库的实现将依赖于编译器和链接器架构的低级细节,例如正确的初始化顺序。

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

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

所有这一切都是说,除非您将自己限制在绝对最少的非托管数据类型(无字符串,无接口)和过程代码(没有类,没有初始化部分,没有需要初始化的数据等)

【讨论】:

  • 你认为 FreePascal 会让它变得更有可能吗?现在它与 Delphi 的兼容性如何?
  • 我认为 FreePascal 在不使用自己的东西时会与 GNU 交互,因此情况可能会相似。但我不是 FreePascal 方面的专家。
  • 正确,关于 FPC 的单独响应见下文
【解决方案2】:

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

为了更好地理解,您必须知道 delphi .dcu 转换为两个不同的 FPC 文件,.ppu 文件与提到的 symtable 内容,其中包括不可链接的代码,如内联函数和通用定义和一个 .o Windows 上的 mingw 兼容 (COFF)。 Cygwin 在链接级别上也与 mingw 兼容(但运行时不同且可怕)。无论如何,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 链接库链接到具有合适许可证的应用程序。 (例如 GPL)在 64 位上它们也应该兼容,但这可能比 win32 测试得少。

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

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

当然,一旦您还需要例外以跨 gccfpc 边界工作,那么您就不走运了。 FPC 不使用 SEH,或任何与其他 ATM 兼容的方案。 (与使用 SEH 的 Delphi 相反,Barry 至少在理论上应该给你一个优势?) OTOH,gcc 可能会使用它自己的 libunwind 而不是 SEH。

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

在 *nix 上这是沼泽标准(例如 apache 模块),但我不知道有多少人在 win32 上这样做。

关于兼容性; FPC 可以编译 Indy、Teechart、Zeos、ICS、Synapse、VST 等软件包 并且很少或没有 mods 更多。已发布版本的方言级别是 D7 及以上的混合级别,重点是 D7。在主干版本中,方言级别正在缓慢攀升至 D2006 级别。 (with for in, class abstract 等)

【讨论】:

    【解决方案3】:

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


    (High-Res)

    【讨论】:

    • 问题是它们是否可以被像 gcc 这样的工具链使用,我认为这些 obj 文件不兼容..
    • 希望专家(Wheeler、Kennedy 等)能尽快做出决定!
    • @Andreas:不要卖空自己。你在这里为自己做得很好,而且 IMO 你可能和我和罗布在同一个联盟。我们在这里待的时间比你长。
    • 到目前为止谢谢 :-) Delphi obj 文件不在 OMF 格式中,我认为 win32 二进制文件是 COFF 和 Linux ELF。我想这些格式之间会有转换器。
    • Afaik 曾经有一个用 C++builder 打包的转换器?
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 2011-11-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-09
        • 1970-01-01
        • 1970-01-01
        • 2023-03-19
        • 1970-01-01
        相关资源
        最近更新 更多