在2020年1月15日,Embarcadero将RSP-12869的状态从“需要反馈”更改为“开放”,并将其分配给内部开发人员。
历史记录:
2017年4月发布的C++ Builder 10.2 Tokyo版本中,Embarcadero升级了链接器,并声称解决了问题:“链接器现在是大地址感知的,在64位系统上可以寻址高达4GB,是之前的两倍。(一些客户过去通过在PE头中切换位来使链接器成为LAE [sic]。由于代码不是为LAE感知而编写的,因此这种黑客行为会阻止增量链接和有时会影响其他功能。)” https://community.embarcadero.com/blogs/entry/what-s-new-in-c-builder-10-2-part-1-the-linker
然而,2017年5月24日,Ashleigh Quick报告说10.2 Tokyo的链接器仍然没有解决这个问题:RSP-12869。同样,@Ultralisk在2020年1月9日的评论中报告了同样的问题。
以下是一个解决方法:从10.2 Tokyo开始,您有一些新选项来控制LARGEADDRESSAWARE和链接器堆大小。Dieter Woellner在2017年10月26日报告说,临时将C++-Linker | Advanced | Advanced Options条目设置为“-GF:LARGEADDRESSAWARE”可以消除问题。但问题重新出现了,他发现如果将TDS Heapsize设置为低于0x08000000的值,则可以避免链接时出现错误/崩溃...目前为止。
=====================================
我是那些黑客链接器使其成为LAA的客户之一,从而干扰了增量链接(我不需要)并解决了我的问题。如果您不需要增量链接,请继续阅读。
=====================================
我通过在
ilink32.exe
中设置
/LARGEADDRESSAWARE
标志来解决了这个问题。最初的解决方案来自Hiroyuki Shimada,使用
editbin
,并于2016年1月12日发布在
http://qc.embarcadero.com/wc/qcmain.aspx?d=134775上。他还将其应用于
bcc32.exe
;我不需要这样做。
作为公共服务,我在这里发布了我的修补过的ilink32.exe版本:
要使用任何一个版本,请将您RAD Studio二进制文件目录中的
ilink32.exe
重命名(例如RAD Studio Seattle的
C:\Program Files (x86)\Embarcadero\Studio\17.0\bin
,或Berlin的
...\18.0\bin
),然后将我的文件复制到该位置,并将其重命名为
ilink32.exe
。
[注意:这些/LAA链接器可为许多用户解决问题,但并非所有用户;请参阅Andrew Legget于2016年7月25日在
https://quality.embarcadero.com/browse/RSP-13247上的帖子]
这个问题已经存在很长时间,并不限于XE3、XE5、XE7、XE8...现在有一个长篇讨论/哀叹,位于
https://quality.embarcadero.com/browse/RSP-13247,关于为什么在RAD Studio的一个版本中修复了此问题,但在后来的版本中撤回了;显然,/LAA“在使用静态RTL进行增量链接时导致失败”。根据Dennis Jones在该线程中发布的2016年3月28日下午12:14的帖子,/LAA补丁不解决其他链接器错误“EXE1825”或“内存不足”。
如果您想查看三种可以修补ilink32.exe的方法,请继续阅读...
使用可从http://cc.embarcadero.com/Item/30459下载的lamarker工具设置大地址标志(感谢Doug Hay在https://quality.embarcadero.com/browse/RSP-13247中的19/Jul/16帖子):
lamarker -M -Filink32.exe
(您可以直接在C:\Program Files (x86)\Embarcadero\Studio\17.0\bin
(或...\18.0\bin
)目录中执行此操作;它将重命名原始的ilink32.exe
为ilink32.exe.old
-- 如果您有权限)
--OR--
如果您已经安装了MS Visual Studio,则可以使用其中的editbin
。作为预备步骤,请复制bcc32.exe
和ilink32.exe
以防止UAC的阻止(并备份它们)
copy "C:\Program Files (x86)\Embarcadero\RAD Studio\12.0\bin\bcc32.exe" .
copy "C:\Program Files (x86)\Embarcadero\RAD Studio\12.0\bin\ilink32.exe" .
editbin /LARGEADDRESSAWARE bcc32.exe
editbin /LARGEADDRESSAWARE ilink32.exe
-- OR --
- 使用masm32包中的
editbin
设置大地址标志:
从http://www.masm32.com/download.htm下载,它会创建c:\masm32\bin\editbin.exe
。在MASM32安装过程中,我收到了一些警告(涉及序数201和203),但其自检通过了,我所需要的只是editbin.exe
。