WASI函数的ABI格式



我正在构建一个Webassembly运行时,目前正在实现WASI api。我想知道ABI看起来像什么,根据这个文档:https://github.com/WebAssembly/WASI/blob/main/phases/snapshot/docs.md

为了进行测试,我将这个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>写入该地址,但是如果我这样做并返回0(表示成功),fd_write将被一遍又一遍地调用(大概是因为printf函数假设没有写入任何内容)。如果我返回写入的字节,程序就会正确终止,但是第四个参数是什么呢?此外,我怎么能返回更复杂的Results,不适合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的一些实现,最后一个参数是一个指针,返回写入的字节数,返回值总是0(就像你所做的那样)。

所以我猜你也应该设置已读取的字节数到retptr0指向的位置。

相关内容

  • 没有找到相关文章

最新更新