HOUSE 函数的 ABI 格式
ABI format of WASI functions
我正在构建一个 Webassembly 运行时并且目前正在实现 WASI API。根据这份文件,我想知道 ABI 是什么样子的:https://github.com/WebAssembly/WASI/blob/main/phases/snapshot/docs.md
为了测试,我使用 emscripten 将此 C 应用程序编译为独立的 WASM 模块。
#include <stdio.h>
int main() {
printf("Hello, World!\n");
return 0;
}
使用 wasm-objdump 检查后,我可以看到以下函数导入:
Import[2]:
- func[0] sig=2 <__wasi_proc_exit> <- wasi_snapshot_preview1.proc_exit
- func[1] sig=11 <__wasi_fd_write> <- wasi_snapshot_preview1.fd_write
类型签名:
- type[2] (i32) -> nil
- type[11] (i32, i32, i32, i32) -> i32
根据规范,fd_write
函数具有签名 fd_write(fd: fd, iovs: ciovec_array) -> Result<size, errno>
,它映射到 POSIX 系统调用 ssize_t writev(int fd, const struct iovec *iov, int iovcnt);
.
但是WASM文件中的第四个参数是什么?它接收一些指向内存地址的指针。所以我想我必须将 Result<size, errno>
写入该地址,但如果我这样做并且 return 0 (为了成功), fd_write
会被一遍又一遍地调用(大概是因为printf 函数假定没有写入任何内容)。如果我 return 写入字节,程序将正确终止,但是第四个参数是什么?
另外,我怎样才能 return 更复杂的 Result
s,它不适合 i32?
在wasi-libc中,__wasi_fd_read
的函数签名为:
__wasi_errno_t __wasi_fd_read( __wasi_fd_t fd, const __wasi_iovec_t *iovs, size_t iovs_len, __wasi_size_t *retptr0 )
根据 fd_write
的某些实现,最后一个参数是指向 return 写入字节数的指针,并且 return 值始终为 0(就像您所做的那样).
所以我想你还应该将已读取的字节数设置为 retptr0
指向的位置。
我正在构建一个 Webassembly 运行时并且目前正在实现 WASI API。根据这份文件,我想知道 ABI 是什么样子的:https://github.com/WebAssembly/WASI/blob/main/phases/snapshot/docs.md
为了测试,我使用 emscripten 将此 C 应用程序编译为独立的 WASM 模块。
#include <stdio.h>
int main() {
printf("Hello, World!\n");
return 0;
}
使用 wasm-objdump 检查后,我可以看到以下函数导入:
Import[2]:
- func[0] sig=2 <__wasi_proc_exit> <- wasi_snapshot_preview1.proc_exit
- func[1] sig=11 <__wasi_fd_write> <- wasi_snapshot_preview1.fd_write
类型签名:
- type[2] (i32) -> nil
- type[11] (i32, i32, i32, i32) -> i32
根据规范,fd_write
函数具有签名 fd_write(fd: fd, iovs: ciovec_array) -> Result<size, errno>
,它映射到 POSIX 系统调用 ssize_t writev(int fd, const struct iovec *iov, int iovcnt);
.
但是WASM文件中的第四个参数是什么?它接收一些指向内存地址的指针。所以我想我必须将 Result<size, errno>
写入该地址,但如果我这样做并且 return 0 (为了成功), fd_write
会被一遍又一遍地调用(大概是因为printf 函数假定没有写入任何内容)。如果我 return 写入字节,程序将正确终止,但是第四个参数是什么?
另外,我怎样才能 return 更复杂的 Result
s,它不适合 i32?
在wasi-libc中,__wasi_fd_read
的函数签名为:
__wasi_errno_t __wasi_fd_read( __wasi_fd_t fd, const __wasi_iovec_t *iovs, size_t iovs_len, __wasi_size_t *retptr0 )
根据 fd_write
的某些实现,最后一个参数是指向 return 写入字节数的指针,并且 return 值始终为 0(就像您所做的那样).
所以我想你还应该将已读取的字节数设置为 retptr0
指向的位置。