i've finally started looking at p2.
built current main (d0382948) of https://github.com/WebAssembly/wasi-libc with make WASI_SNAPSHOT=p2
i'm compiling this one-line c program:
$ cat hello.c
int puts(const char*);int main(){puts("Hello, world!");}
$ clang-17 -target wasm32-wasip2 --sysroot /s/wasi-libc/sysroot -O2 hello.c
this seems to produce a file with rather unexpected imports:
$ wasm-objdump -x -j Import a.out
a.out: file format wasm 0x1
Section Details:
Import[12]:
- func[0] sig=2 <wasi_snapshot_preview1.fd_close> <- wasi_snapshot_preview1.fd_close
- func[1] sig=5 <wasi_snapshot_preview1.fd_fdstat_get> <- wasi_snapshot_preview1.fd_fdstat_get
- func[2] sig=6 <wasi_snapshot_preview1.fd_seek> <- wasi_snapshot_preview1.fd_seek
- func[3] sig=4 <wasi_snapshot_preview1.fd_write> <- wasi_snapshot_preview1.fd_write
- func[4] sig=1 <wasi:io/poll@0.2.0.[resource-drop]pollable> <- wasi:io/poll@0.2.0.[resource-drop]pollable
- func[5] sig=1 <wasi:io/streams@0.2.0.[resource-drop]input-stream> <- wasi:io/streams@0.2.0.[resource-drop]input-stream
- func[6] sig=1 <wasi:io/streams@0.2.0.[resource-drop]output-stream> <- wasi:io/streams@0.2.0.[resource-drop]output-stream
- func[7] sig=1 <wasi:sockets/udp@0.2.0.[resource-drop]udp-socket> <- wasi:sockets/udp@0.2.0.[resource-drop]udp-socket
- func[8] sig=1 <wasi:sockets/udp@0.2.0.[resource-drop]incoming-datagram-stream> <- wasi:sockets/udp@0.2.0.[resource-drop]incoming-datagram-stream
- func[9] sig=1 <wasi:sockets/udp@0.2.0.[resource-drop]outgoing-datagram-stream> <- wasi:sockets/udp@0.2.0.[resource-drop]outgoing-datagram-stream
- func[10] sig=1 <wasi:sockets/tcp@0.2.0.[resource-drop]tcp-socket> <- wasi:sockets/tcp@0.2.0.[resource-drop]tcp-socket
- func[11] sig=2 <wasi_snapshot_preview1.adapter_close_badfd> <- wasi_snapshot_preview1.adapter_close_badfd
and sure enough, i can't seem to run it:
$ wasmtime run -S preview2 a.out
Error: failed to run main module `a.out`
Caused by:
0: failed to instantiate "a.out"
1: unknown import: `wasi:io/poll@0.2.0::[resource-drop]pollable` has not been defined
what am i missing?
If you install wasm-tools, then grab the Preview 1 adapter (e.g. curl -LO https://github.com/bytecodealliance/wasmtime/releases/download/v19.0.1/wasi_snapshot_preview1.command.wasm
) and run wasm-tools component new --adapt wasi_snapshot_preview1.command.wasm a.out -o component.wasm
, Wasmtime should be able to run component.wasm
.
The reasons you need to do the above are (1) wasm-ld
generates a module, but Wasmtime only knows how to run Preview 1 modules and Preview 2 components, and (2) the wasm32-wasip2
target in wasi-sdk
currently imports a mix of Preview 1 and Preview 2 functions while we incrementally add support for Preview 2, and while that is the case we need to use an adapter to map the Preview 1 imports to Preview 2 imports. See https://github.com/WebAssembly/wasi-libc/issues/447 for details.
thanks! so if my aim was to implement enough of wasip2 in my runtime to run my (wasi-libc-based) code, it might be a bit too soon?
the second takeaway for me, which isn't really a question, is that i should once again try and read through the component model documentation in the hopes of understanding (in order of importance) the why and the how.
is wasmtime expected to eventually support wasip2 modules through the cm canonical abi, or will it be component model all the way?
I'm not aware of any plans to support wasip2 modules. One easy way to do it would be to convert such modules to components "just in time" using wit-component
prior to instantiating them in wasmtime run
. Not sure if there's interest in adding such a feature, though. If you're adding support for wasip2 to your own runtime, though, you're free to do whatever you like. This might be relevant: https://github.com/WebAssembly/wasi-libc/issues/447#issuecomment-1971367144
Last updated: Dec 23 2024 at 12:05 UTC