"数据元素太大"使用fpc编译+汇编时出错(在OSX上)

时间:2015-08-29 01:24:33

标签: macos linker 32bit-64bit freepascal fpc

在64位Mac / OSX环境中编译和汇编Data element too large(免费Pascal编译器)时,如何解决并修复致命fpc错误?

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

详细信息:使用从{{3}安装的build.sh 3.0.0-rc1从https://github.com/whatwg/wattsi运行fpc脚本时出现错误(来自pc-3.0.0rc1.intel-macosx.dmg图片)。 (注意: ftp://freepascal.stack.nl/pub/fpc/beta/3.0.0-rc1/i386-macosx/ - 而不是,我猜,v2.6.4,最新稳定?)。

构建运行正常,直到编译README.md file says I need to use 3.0.0-rc1 specifially源后,它在尝试汇编该源时失败并显示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]会导致某种系统限制造成的?{/ 1}}

到目前为止,我的故障排除尝试的范围是在构建来源的https://github.com/whatwg/wattsi/blob/master/src/html/htmlparser.pas文件中,有一行ulimit -v 800000,我认为这可能会过度限制内存资源 - 所以我删除了那一行并重新运行了构建脚本,但我仍然在同一点上遇到Data element too large错误。

我在Free Pascal总计n00b,所以在这一点上我完全被这个错误所困扰。

2 个答案:

答案 0 :(得分:1)

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

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

由于类型可能永远不会分配,只需重新调整bounderies以适应,例如

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

(可能减去一些元素以确定,我不知道2GB-2是否是真正的限制,IIRC旧的delphis有下限)

甚至只是

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

在您访问它的位置禁用运行时检查。高上限是一个不会进入运行时检查的人工构造

答案 1 :(得分:0)

尝试从{/ 3>更改src/build.sh中的DEFINES

DEFINES="-dUSEROPES -dLINES -dPARSEERROR"

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

这实际上是一个新的注释添加到repo原点README.md