wasm64-unknown-unknown

层级: 3

使用 64 位内存的 WebAssembly 目标,依赖于 memory64 WebAssembly 提案。

目标维护者

  • Alex Crichton,https://github.com/alexcrichton

要求

此目标是交叉编译的。该目标以与 wasm32-unknown-unknown 目标相同的方式支持 std,也就是说它带有标准库,但许多 I/O 函数(如 std::fsstd::net)将简单地返回错误。此外,像 println! 这样的 I/O 操作实际上不做任何事情,并且打印的内容不会被路由到任何地方。这与 wasm32-unknown-unknown 目标相同。此目标默认带有分配器,目前是 dlmalloc,它是 移植到 Rust 的。

此目标与 wasm32-unknown-unknown 的区别在于,它是为 64 位内存而不是 32 位内存编译的。这意味着 usize 以及指针都是 8 字节大小的。但是,权衡之处在于,最大内存大小现在是完整的 64 位地址空间,而不是 wasm32-unknown-unknown 的 32 位地址空间所限制的 4GB。

此目标不是稳定目标。memory64 WebAssembly 提案仍在进行中,尚未标准化。这意味着没有很多引擎实现 memory64 功能,如果它们实现了,它们可能也在标志后面,例如

  • Nodejs - --experimental-wasm-memory64
  • Wasmtime - --wasm-features memory64

另请注意,目前 wasm64-unknown-unknown 目标假设存在其他合并的 wasm 提案,例如(及其 LLVM 功能标志)

wasm64-unknown-unknown 目标旨在匹配其 "C" ABI 的默认 Clang 目标,这很可能与 Clang 的 wasm32-unknown-unknown 大致相同。

注意:由于此目标处于相对早期的阶段,因此在使用此目标时可能会遇到 LLVM 错误。如果发现断言命中或错误,建议在 rust-lang/rust 或理想情况下在 LLVM 本身中打开一个 issue。

此目标目前不支持 panic=unwind

构建目标

您可以通过将其添加到 config.toml 中的 target 列表中来构建支持该目标的 Rust,并且该目标还需要构建 lld 才能工作。

[build]
target = ["wasm64-unknown-unknown"]

[rust]
lld = true

构建 Rust 程序

Rust 尚未为此目标提供预编译的工件。要为此目标进行编译,您要么需要启用目标构建 Rust(请参阅上面的“构建目标”),要么通过使用 build-std 或类似方法构建自己的 std 副本。

请注意,为 wasm64-unknown-unknown 设置了以下 cfg 指令

  • cfg(target_arch = "wasm64")
  • cfg(target_family = "wasm")

测试

目前,对 wasm64-unknown-unknown 的测试支持不是很好,Rust 项目没有为此目标运行任何测试。测试支持在某种程度上有效,但如果没有 println!,运行的测试并不是最令人兴奋的。

交叉编译工具链和 C 代码

理论上可以使用 C 代码为 wasm64-unknown-unknown 编译 Rust 代码,但目前没有已知的工具链可以做到这一点。在撰写本文时,没有已知的适用于 wasm64-unknown-unknown 的 wasm “libc”,这意味着使用此目标混合 C 和 Rust 实际上是无法完成的。