【问题标题】:Recompiling the RTL - if possible, then how?重新编译 RTL - 如果可能,那么如何?
【发布时间】:2011-01-29 21:23:45
【问题描述】:

我渴望做一些实验来修改 Delphi 运行时库 (RTL) 的底层,system.pas 等等......这可能吗?

我非常喜欢“是的,但是您必须为某些汇编程序魔法提供自定义 .obj 文件,因为它们从未与官方 Delphi 源代码一起分发”之类的挑战。没关系,我只是想知道。

我想用 Delphi 7 做这个实验,但是任何其他版本的内部信息都可以。这是与自石器时代以来就与德尔福合作的公司合作的好处之一。

(我一直认为这是 RTFM 问题之一,答案是响亮的“不!”,但出于某种原因,谷歌不会确认。)

【问题讨论】:

    标签: delphi


    【解决方案1】:

    您可以像任何其他单元一样重新编译 RTL。

    对于 System.pas,您必须使用命令行编译器。

    例如,这是一个工作批处理文件内容(有一些没有很好记录的命令行开关):

    del *.dcu /s
    "c:\program files\borland\delphi7\bin\dcc32.exe" -O+ -Q -M -Y -Z -$D+ System.pas 
    

    这将重新编译 System.pas 和 SysInit.pas(都是最低级别的 RTL 文件)。

    但是为了使用您重新创建的 dcu 文件,您必须将包含更新的 dcu 文件的文件夹放入 IDE 的第一个位置:例如,在 Delphi 7 中它是选项/环境选项/库,然后放入您的文件夹首先位于“库路径”和“浏览路径”字段中。

    也许值得删除 Delphi 安装目录中的原始 .dcu 文件。

    但请确保您不会更改单元的“接口”部分,否则您将无法使用其他未修改的 RTL 单元(或第三方组件)进行编译。您可以更改“实现”部分,应用修复或重写某些部分以提高速度等,但不要更改“接口”部分以避免任何链接错误。

    始终备份您正在更改的原始 .pas 和 .dcu 文件。做一些自动化编译测试是个好主意,这样您就可以确定您对 RTL 的修改不会添加任何回归。

    我们为 Enhanced Run Time Library 进行了这样的 RTL 重新编译,以提高低级 RTL 函数(主要是 System.pas 和 SysUtils.pas)的速度。专为 Delphi 7 和 2007 设计。对于较新的 Delphi 版本,您仍然可以使用相同的原理。

    【讨论】:

    • 感谢您的清晰文章,并以艰苦的经验为后盾。太棒了!
    • 这是一个非常古老的问题/答案,但我可以确认这仍然是 Delphi 10.3 中的有效解决方案。谢谢
    【解决方案2】:

    您只能从命令行重新编译 RTL。安装的 RTL 源目录中应该有一个 makefile。它旨在与 make.exe 命令行实用程序一起使用,该实用程序应位于安装的“bin”文件夹中。我建议您将相关来源复制到单独的位置进行实验。我必须提醒您,系统单元与编译器紧密耦合,编译器期望许多函数具有特定的名称并具有特定的参数列表(如果有的话)。许多 RTL “辅助”函数没有任何正式声明的参数,但期望以某种方式传递参数。

    另外一点需要注意的是更改某些类、函数或类型的接口声明。这样做可能会导致与现有 DCU 文件和组件严重不兼容。因此,在将包含的 RTL 或第三方组件中的 DCU 文件与您的自定义修改版本混合时,您必须非常小心。我建议您先仅在进入接口破坏性更改的雷区之前更改实现部分。

    【讨论】:

    • 我记得曾经编译器也依赖于 System.pas 的声明顺序。自从我重新编译 RTL 以来已经很久了,所以这可能是在 Turbo Pascal / Delphi 1(16 位)时代。
    • 什么叫 RTL?对于 System.pas 和 SysInit.pas,只能从命令行完成。但是对于其他更高级别的单元(如 Classes.pas 或 SysUtils.pas),它可以从 IDE 完成,只需在 IDE 选项中更改旧的库文件,并提供另一个将使用的 .pas 源来代替默认版本。
    • 我记得 Variants.pas 即使不做任何更改也不容易重新编译。
    • @Torbins AFAIR 存在一些循环依赖问题:要重新编译 Variants.pas,您必须以正确的顺序重新编译 RTL 文件。使用命令行编译器很容易做到这一点。而且如果你不使用variant,你可以提供一个void one,并节省一些代码空间(这是KOL或我们的LVCL所做的)。
    • @Allen 在我修改 System.Rtti.pas 后,我刚刚使用 buildrtl.bat 和 release 但是当我将 dcu 放入 lib 文件夹时,它告诉我 F2051 Unit System.Classes 是用不同的System.Rtti.TRttiContext 的版本。我猜 buildrtl.bat 版本使用的编译器选项与随附的不同?
    猜你喜欢
    • 2012-02-13
    • 2021-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-13
    • 2023-03-21
    • 1970-01-01
    相关资源
    最近更新 更多