"Data element too large" 使用 fpc 编译+汇编时出错(OSX)

"Data element too large" error when compiling+assembling with fpc (on OSX)

在 64 位 Mac/OSX 环境中使用 fpc(Free Pascal 编译器)进行编译和汇编时,如何排除和修复致命的 Data element too large 错误?

似乎错误的原因可能是 array[0..MaxInt] 调用(更多详细信息请参见下文),但如果是这样,我不知道如何修复它或解决它。

详细信息: 当 运行 来自 https://github.com/whatwg/wattsi using fpc 3.0.0-rc1 installed from ftp://freepascal.stack.nl/pub/fpc/beta/3.0.0-rc1/i386-macosx/ (from the pc-3.0.0rc1.intel-macosx.dmg image). (Note: The README.md file says I need to use 3.0.0-rc1 specifiallybuild.sh 脚本时,我得到了那个错误——我猜,而不是 v2 .6.4,最新稳定版?)。

构建运行良好,直到在编译 https://github.com/whatwg/wattsi/blob/master/src/html/htmlparser.pas 源之后,在尝试 assemble 该源时失败并出现 Data element too large 错误。

具体来说,它记录了这个:htmlparser.pas(336,42) Error: Data element too largehtmlparser.pas 文件的第 333 到 336 行如下所示:

type
    TBlob = Pointer;
    PBlobArray = ^TBlobArray;
    TBlobArray = array[0..MaxInt] of TBlob;

…所以我怀疑 Data element too large 错误是由它 运行 引起的某种系统限制,由于 array[0..MaxInt]?

到目前为止,我的故障排除尝试的范围是在由构建获取的 https://github.com/whatwg/wattsi/blob/master/src/lib/compile.sh 文件中,有一行 ulimit -v 800000 我认为它可能过度限制了内存资源——所以我删除了那行并重新 运行 构建脚本,但我仍然在完全相同的点出现 Data element too large 错误。

尝试将 src/build.sh 中的 DEFINES 行从

更改为

DEFINES="-dUSEROPES -dLINES -dPARSEERROR"

DEFINES="-dUSEROPES -dLINES -dPARSEERROR -Px86_64"

这实际上是添加到 repo 来源的新注释 README.md

最近的 FPC 进行了一种编译时范围检查。此范围检查确定类型太大的编译时间,即使它从未实际分配过(总是使用指针使用,旧的 Delphi 版本不能过度索引指针,因此使用了此构造)

这是该技术的一个已知限制,严格来说,原始来源存在错误。

由于可能从未分配过类型,只需重新调整边界以适应,例如

 TBlobArray = array[0..MaxInt div sizeof(tblob)] of TBlob;

(也许减去几个元素才能确定,我不知道2GB-2是否是真正的限制,IIRC旧的delphis有下限)

甚至只是

 TBlobArray = array[0..0] of TBlob;

并禁用运行时间检查您访问它的位置。上限是一个人为构造,不 运行 进入 运行 时间检查