首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WASI函数的ABI格式

WASI函数的ABI格式
EN

Stack Overflow用户
提问于 2021-10-07 18:27:08
回答 1查看 344关注 0票数 0

我正在构建一个组件运行时,目前正在实现WASI API。我想知道ABI是什么样子,根据下面的文档:https://github.com/WebAssembly/WASI/blob/main/phases/snapshot/docs.md

为了进行测试,我用emscripten将这个C应用程序编译成一个独立的WASM模块。

代码语言:javascript
复制
#include <stdio.h>

int main() {
    printf("Hello, World!\n");
    return 0;
}

在检查wasm-objdump之后,我可以看到以下函数导入:

代码语言:javascript
复制
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

具有类型签名:

代码语言:javascript
复制
 - type[2] (i32) -> nil
 - type[11] (i32, i32, i32, i32) -> i32

根据规范,fd_write函数具有签名fd_write(fd: fd, iovs: ciovec_array) -> Result<size, errno>,该签名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函数假定没有写任何东西)。如果我返回所写的字节,程序将正确终止,那么第四个参数是什么呢?此外,我如何返回更复杂的Result,这不适合于一个i32?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-12 14:15:41

瓦西中,__wasi_fd_read的函数签名是:

代码语言:javascript
复制
__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指向的位置。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69486132

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档