"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 specifially 的 build.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 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
错误。
尝试将 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;
并禁用运行时间检查您访问它的位置。上限是一个人为构造,不 运行 进入 运行 时间检查
在 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 specifially 的 build.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 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
错误。
尝试将 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;
并禁用运行时间检查您访问它的位置。上限是一个人为构造,不 运行 进入 运行 时间检查