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 git@github.com: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