使用 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 large
。 htmlparser.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 上)的主要内容,如果未能解决你的问题,请参考以下文章
使用 GetComputerObjectNameW win API 时出现编译错误