为 ARM 编译时使用中断 zksync

Usize breaking zksync when compiling for ARM

这是一个复杂而棘手的问题,但我会尽我所能来分解它。归结为我正在为 ARM64 编译一个 Rust 项目(目标是 运行 on rasp pi 4)。

大多数库都可以编译 (704 / 740),但在编译 zksync directory. The the yagna client for golem 时它会在编译期间中断,我正在编译,我正在使用

目标 - target.arm-未知-linux-musleabi 链接器 - arm-linux-gnueabihf-ld

我很想听听想法解决方案,或者我做错了什么,这样我就可以在 ARM 上获得这个项目 运行ning。 我得到的错误代码是

 Ok(stat.blocks_available() as u64 * stat.fragment_size())
^^^^^^^^^^^^^^^^^^^^ expected `u64`, found `u32`

除其他错误外,所有错误都与转换整数时的位差有关。这让我怀疑 usize 是罪魁祸首,因为它基于 CPU 架构的大小,这可以解释 ARM 编译搞砸了它,并且直到你必须处理 int(在转换时)才出现。

如果您需要更多信息,请告诉我,我已尽力概括问题

stat 是一个 Statvfs structure, the return type of Statvfs::blocks_available() is fsblkcnt_t, and the return type of Statvfs::fragment_size() is c_ulong. These two types are defined in the libc 包,它是围绕低级 C OS 调用的薄纸包装器。这些类型等同于 OS-specific *.h 文件中的 C 类型。类型的大小因平台而异。

您正在编译的库似乎对这些大小及其算术兼容性有一些假设。

向库作者报告一些错误。

如果您愿意自己修补库,那么您应该首先调查您平台的 libc 包并检查您所看到的错误中涉及的所有类型的定义。然后修复算术表达式,使类型兼容并且不会溢出。

我认为 Rust 的类型系统不够智能,无法支持一个代码体来安全(无溢出或截断)和高效(无需将所有内容强制转换为 u128)来处理所有可能的类型大小组合。可能需要特定于平台的补丁。