重新编译RTL - 如果可能的话,怎么做?

23

我渴望尝试修改Delphi运行时库(RTL)中的底层内容,例如system.pas等...这是可能的吗?

我非常喜欢像“是的,但是您需要提供一些汇编巫术的自定义.obj文件,因为它们从未与官方Delphi源代码一起分发”这样的挑战。对我来说没问题,我只是想知道。

我想在Delphi 7中进行这个实验,但其他版本的内部信息也可以。这是和一家从石器时代就使用Delphi的公司在一起的好处之一。

(我一直认为这是一个RTFM问题,答案是坚定的“NO!”,但由于某种原因,谷歌无法确认。)

2个回答

25
你可以像重新编译其他单位一样重新编译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中,它是Option / Environment Options / Library,然后在“Libary path”和“Browsing path”字段中将您的文件夹FIRST放在第一位。

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

但请确保不要更改单元的“interface”部分,否则您将在与RTL(或第三方组件)未修改的单位编译时遇到麻烦。您可以更改“implementation”部分,应用修复程序或重写某些部分以提高速度等,但不要更改“interface”部分以避免任何链接错误。

始终备份您正在更改的原始.pas和.dcu文件。建议进行一些自动化编译测试,以确保您对RTL的修改不会添加任何回归。

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


感谢您清晰的写作,以及通过实际经验的支持。非常棒! - Paul-Jan
这是一个非常古老的问题/答案,但我可以确认在Delphi 10.3中仍然是有效的解决方案。谢谢。 - Johann Burgess

16

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

另一个需要注意的问题是更改某些类、函数或类型的接口声明。这样做可能会导致现有DCU文件和组件出现严重的不兼容性。因此,在混合包含的RTL或第三方组件的DCU文件与您的自定义修改版本时,必须非常小心。我建议您先只进行实现部分的更改,然后再冒着破坏接口的风险进行更改。


我记得有一次编译器还依赖于 System.pas 声明的顺序。自从我重新编译 RTL 以来已经过了很长时间,所以这可能是在 Turbo Pascal / Delphi 1(16 位)时代。 - Jeroen Wiert Pluimers
2
我们如何称呼RTL?对于System.pas和SysInit.pas,只能通过命令行完成。但是对于其他更高级别的单元(例如Classes.pas或SysUtils.pas),可以通过在IDE选项中更改库文件并提供另一个.pas源文件来代替默认版本,从而可以在IDE中完成。 - Arnaud Bouchez
据我记得,即使没有更改,Variants.pas 也不容易重新编译。 - Torbins
1
@Torbins,如果我没记错的话,有一些循环依赖问题:要重新编译Variants.pas,必须按正确顺序重新编译RTL文件。使用命令行编译器很容易做到这一点。如果您不使用variant,可以提供一个空的,从而节省一些代码空间(这就是KOL或我们的LVCL所做的)。 - Arnaud Bouchez
@Allen,我刚刚在修改了System.Rtti.pas后使用了buildrtl.bat的release版本,但是当我把dcu放到lib文件夹中时,它告诉我F2051 Unit System.Classes是用不同版本的System.Rtti.TRttiContext编译的。我猜测buildrtl.bat release使用的编译器选项与已发行的选项不同? - Stefan Glienke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接