使用 fpc 编译+组装时出现“数据元素太大”错误(在 OSX 上)

Posted

技术标签:

【中文标题】使用 fpc 编译+组装时出现“数据元素太大”错误(在 OSX 上)【英文标题】:"Data element too large" error when compiling+assembling with fpc (on OSX) 【发布时间】:2015-11-23 18:01:04 【问题描述】:

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

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

详细信息:当我使用从ftp://freepascal.stack.nl/pub/fpc/beta/3.0.0-rc1/i386-macosx/ 安装的fpc 3.0.0-rc1 从https://github.com/whatwg/wattsi 运行build.sh 脚本时遇到该错误(来自pc-3.0.0rc1.intel-macosx.dmg 图像)。 (注意:README.md file says I need to use 3.0.0-rc1 specifially——我猜是最新的稳定版 v2.6.4?)。

编译运行良好,直到编译 https://github.com/whatwg/wattsi/blob/master/src/html/htmlparser.pas 源代码后,在尝试组装该源代码时它失败并出现 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 错误。

【问题讨论】:

【参考方案1】:

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

DEFINES="-dUSEROPES -dLINES -dPARSEERROR"

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

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

【讨论】:

谢谢,我知道自述文件的更改——实际上我是添加它的人 :-) 我只是没有时间自己在这里发布解释作为答案,但是现在会努力做到这一点。【参考方案2】:

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

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

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

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

(也许减去一些元素可以确定,我不知道2GB-2是否是真正的限制,IIRC老delphis有更低的限制)

甚至干脆

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

并在您访问它的位置禁用运行时检查。上限是人为构造,不会遇到运行时检查

【讨论】:

以上是关于使用 fpc 编译+组装时出现“数据元素太大”错误(在 OSX 上)的主要内容,如果未能解决你的问题,请参考以下文章

FPC的柔性和可靠性设计

编译时出现ARC错误

使用 GetComputerObjectNameW win API 时出现编译错误

使用 GPUImage 归档 ios 应用程序时出现编译错误

使用 typedef、多维数组和指针时出现编译器错误

在 Cython 中使用 move 方法时出现编译错误