#wasm-binary #elf #wasi #compiler #compile #favorite #running

bin+lib wasker

在您喜欢的内核上运行 Wasm 的 Wasm 编译器

2 个版本

0.1.1 2024 年 3 月 20 日
0.1.0 2024 年 2 月 19 日

#1013WebAssembly

每月 34 次下载

MIT 许可证

1MB
28K SLoC

WebAssembly 24K SLoC Rust 3.5K SLoC // 0.1% comments

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