wasm2native
Turn WASI apps into native executables
How it works
The approach is similar to WasmBoxC
or RLBox
:
WASM file
🠖 WASM to C translator
🠖 platform C compiler + libuvwasi + libuv
🠖 native executable
Prerequisites
- CMake
- Native toolchain (GCC/Clang/MSVC). Optional: Zig
Usage examples
# Single step:
export CC="clang-12"
export LDFLAGS="-fuse-ld=lld"
./build.sh ./examples/coremark.wasm
# Cross-compile with Zig CC: x86_64-windows-gnu, x86_64-linux-gnu, x86_64-macos-gnu
CC="zig cc -target x86_64-linux-musl" ./build.sh ./examples/coremark.wasm
# Cross-compilation to other architectures
# For full targets list: zig targets | jq .libc
CC="zig cc -target aarch64-linux-musl" ./build.sh ./examples/hello.wasm
qemu-aarch64-static hello.elf
Hello from WebAssembly!
Note: this tool can be used for building WASI
apps, not emscripten
-generated wasm+js
output.
Coremark 1.0 results
Intel(R) Core(TM) i5-10400 CPU @ 2.90GHz, single-thread:
- Native: 32475
- wasm2c: 27400 (84% of native)
TODO
- Big-endian target support
- Windows host support
- Convert main script to
zig
- Allow setting
CFLAGS
, overriding optimization flags
- Allow setting
- CI via Github Actions
- Get rid of mandatory CMake dependency (write build script for
libuv
anduvwasi
for major platforms)
License
This project is released under The MIT License (MIT)