wasm64-unknown-unknown
层级:3
使用 64 位内存的 WebAssembly 目标,依赖于 memory64 WebAssembly 提案。
目标维护者
- Alex Crichton,https://github.com/alexcrichton
要求
此目标是交叉编译的。该目标以与 wasm32-unknown-unknown
目标相同的方式支持 std
,也就是说它附带标准库,但许多 I/O 函数(如 std::fs
和 std::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 功能标志)
- 批量内存 -
+bulk-memory
- 可变导入全局变量 -
+mutable-globals
- 符号扩展操作 -
+sign-ext
- 非陷阱浮点数到整数转换操作 -
+nontrapping-fptoint
wasm64-unknown-unknown
目标旨在与其 "C"
ABI 的默认 Clang 目标相匹配,这很可能与 Clang 的 wasm32-unknown-unknown
大致相同。
注意:由于此目标的早期阶段性质,在使用此目标时,您可能会遇到 LLVM 错误。如果遇到断言命中或发现错误,建议在 rust-lang/rust 或理想情况下在 LLVM 本身中打开一个问题。
此目标目前不支持 panic=unwind
。
构建目标
您可以通过将目标添加到 config.toml
中的 target
列表中来构建支持该目标的 Rust,并且该目标还需要构建 lld
才能工作。
[build]
target = ["wasm64-unknown-unknown"]
[rust]
lld = true
构建 Rust 程序
Rust 尚未为此目标提供预编译的工件。要为此目标编译,您需要启用目标构建 Rust(请参阅上面的“构建目标”),或者使用 build-std
或类似方法构建您自己的 std
副本。
请注意,以下 cfg
指令是为 wasm64-unknown-unknown
设置的
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 实际上无法做到。