2 个版本
0.1.1 | 2024 年 3 月 20 日 |
---|---|
0.1.0 | 2024 年 2 月 19 日 |
#1013 在 WebAssembly
每月 34 次下载
1MB
28K SLoC
Wasker
Wasker 是一个 WebAssembly 编译器。Wasker 将 Wasm 二进制编译成 ELF 格式二进制。目前,Wasker 支持 WASI 预览版 1。
Wasker 的最新功能
已经有软件工具可以将 Wasm 编译成原生二进制。
Wasker 的新功能是,它生成一个 操作系统无关 的 ELF 文件,其中从 Wasm 应用程序发出的 WASI 调用仍然 未解决。
这种未解决的功能允许 Wasker 的输出 ELF 文件与各种操作系统提供的 WASI 实现进行链接,使每个操作系统都能执行 Wasm 应用程序。
Wasker 使您喜欢的操作系统能够作为 Wasm 运行时!
安装
Wasker 编译器基于 LLVM (目前为 LLVM 15)。
假设已经安装了 cargo
。
export LLVM_SYS_150_PREFIX=~/.wasker/clang+llvm-15.0.0-x86_64-linux-gnu-rhel-8.4/
cargo install wasker
运行 Wasker
步骤1:准备 Wasm 二进制
请参阅 示例 了解如何从 Rust 和 Go 构建 Wasm。
cd examples/rust
rustup target add wasm32-wasi
cargo build --target wasm32-wasi
步骤2:运行 Wasker
$ wasker examples/rust/target/wasm32-wasi/debug/rust.wasm
[2024-03-19T12:10:20Z INFO wasker::compiler] input: examples/rust/target/wasm32-wasi/debug/rust.wasm
[2024-03-19T12:10:20Z INFO wasker::compiler] write to ./wasm.ll
[2024-03-19T12:10:20Z INFO wasker::compiler] write to ./wasm.o, it may take a while
[2024-03-19T12:10:21Z INFO wasker::compiler] Compile success
步骤3:在 Linux 上运行 wasker 输出
由 Wasker 生成的 ELF 文件是操作系统无关的:Wasm 应用程序中的 WASI 调用仍然未解决。
请为您的 favorite OS 编写自己的 WASI 包装器并将其与 Wasker 输出链接。
在这里,我们将展示一个 简单示例,说明如何在 Linux 上运行 Wasker 输出。
为 Linux 编译 WASI 包装器并将其与 Wasker 输出链接。
gcc -no-pie ./examples/wasi-wrapper/wasi-wrapper-linux.c ./wasm.o -o hello
运行!!
./hello
还可以查看 Mewz,这是一个具有 WASI 接口的微内核操作系统。Wasker 生成的 ELF 文件可以在 Mewz 上执行而无需任何修改。
开发
选项1:使用 Devcontainer
您可以通过 Devcontainer 尝试 Wasker。
选项2:从源代码构建
git clone [email protected]:mewz-project/wasker.git
cd Wasker
export LLVM_SYS_150_PREFIX=~/.wasker/clang+llvm-15.0.0-x86_64-linux-gnu-rhel-8.4/
cargo install wasker
默认情况下,Wasker 针对的是 x86_64。如果您想针对 AArch64,请重写 build.rs 并将环境变量 LLVM_SYS_150_PREFIX
覆盖如下。
# build.rs
5: let target = format!("clang+llvm-{}-aarch64-linux-gnu-rhel-8.4", llvm_version);
# shell
export LLVM_SYS_150_PREFIX=~/.wasker/clang+llvm-15.0.0-aarch64-linux-gnu/
依赖项
~34MB
~524K SLoC