为什么 bds.exe 可以识别大地址而 dcc32.exe 不能?我可以修补 dcc32.exe header 并且它能正常工作吗?
Why is bds.exe large address aware and dcc32.exe not? Can I patch the dcc32.exe header and it just works?
Delphi10 的一大承诺是减少内存不足错误。这是可行的,因为 IDE 现在可以分配大于 2GB 的地址,并在 PE-Header 中为 bds32.exe
定义了一个特殊标志:
我们有一个带 MSBUILD
的自动化构建环境,它直接调用 dcc32.exe。可悲的是,dcc32.exe
不包含此标志并且无法编译某些项目,因为没有足够的可用内存。
我怀疑这只是 Embarcadero 的疏忽。他们所做的大型地址感知更改的主要焦点是 IDE。通常是 IDE 易受内存不足故障的影响。我怀疑命令行编译器很少遇到这种故障。
现在,编译代码在IDE进程中执行,bds.exe。在默认设置下,编译项目时,不会创建外部进程来执行编译。相反,如果您查看 IDE 加载的模块,您将看到 dcc32230.dll 和 dcc64230.dll。 DLL 包含 32 位和 64 位 Windows 编译器。它们包含与 dcc32.exe 和 dcc64.exe.
相同的代码
由于 dcc32 和 dcc64 的编译器代码可以在 bds.exe 中愉快地存在,一个大地址感知进程,很难想象 dcc32.exe 和 dcc64.exe 不会在下面运行大地址感知条件。因此,我认为这是 Embarcadero 方面的一个简单疏忽,即这些可执行文件没有启用大地址感知 PE 标志。我建议您提交错误报告/功能请求。
所以我认为很可能您可以安全地修改 dcc32.exe 和 dcc64.exe 的可执行文件以启用大地址感知 PE 标志。执行此操作时,明智的做法是执行一些自上而下的分配测试以对更改进行压力测试。可以在这里找到详细信息:.
Delphi10 的一大承诺是减少内存不足错误。这是可行的,因为 IDE 现在可以分配大于 2GB 的地址,并在 PE-Header 中为 bds32.exe
定义了一个特殊标志:
我们有一个带 MSBUILD
的自动化构建环境,它直接调用 dcc32.exe。可悲的是,dcc32.exe
不包含此标志并且无法编译某些项目,因为没有足够的可用内存。
我怀疑这只是 Embarcadero 的疏忽。他们所做的大型地址感知更改的主要焦点是 IDE。通常是 IDE 易受内存不足故障的影响。我怀疑命令行编译器很少遇到这种故障。
现在,编译代码在IDE进程中执行,bds.exe。在默认设置下,编译项目时,不会创建外部进程来执行编译。相反,如果您查看 IDE 加载的模块,您将看到 dcc32230.dll 和 dcc64230.dll。 DLL 包含 32 位和 64 位 Windows 编译器。它们包含与 dcc32.exe 和 dcc64.exe.
相同的代码由于 dcc32 和 dcc64 的编译器代码可以在 bds.exe 中愉快地存在,一个大地址感知进程,很难想象 dcc32.exe 和 dcc64.exe 不会在下面运行大地址感知条件。因此,我认为这是 Embarcadero 方面的一个简单疏忽,即这些可执行文件没有启用大地址感知 PE 标志。我建议您提交错误报告/功能请求。
所以我认为很可能您可以安全地修改 dcc32.exe 和 dcc64.exe 的可执行文件以启用大地址感知 PE 标志。执行此操作时,明智的做法是执行一些自上而下的分配测试以对更改进行压力测试。可以在这里找到详细信息:.