【问题标题】:ABI format of WASI functionsWASI 函数的 ABI 格式
【发布时间】:2021-10-07 18:27:08
【问题描述】:

我正在构建一个 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) -&gt; Result&lt;size, errno&gt;,它映射到 POSIX 系统调用 ssize_t writev(int fd, const struct iovec *iov, int iovcnt);

但是 WASM 文件中的第四个参数是什么?它接收一些指向内存地址的指针。所以我想我必须把Result&lt;size, errno&gt;写到那个地址,但是如果我这样做并返回0(成功),fd_write会被一遍又一遍地调用(大概是因为printf函数假设什么都没有写)。如果我返回写入的字节,程序会正确终止,但是第四个参数是什么? 另外,如何返回不适合 i32 的更复杂的 Results?

【问题讨论】:

    标签: webassembly wasi


    【解决方案1】:

    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 指向的位置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多