首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用wasi-sdk在C中直接调用WASI函数(导入模块问题)

如何使用wasi-sdk在C中直接调用WASI函数(导入模块问题)
EN

Stack Overflow用户
提问于 2020-07-24 19:13:18
回答 1查看 226关注 0票数 0

我正在尝试使用wasi-sdk在C程序中直接调用WASI函数(fd_write)。这是库(lib.c):

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

struct Ciovec
{
    uint8_t *buf;
    uint32_t buf_len;
};

uint16_t fd_write(uint32_t fd, struct Ciovec *iovs_ptr, uint32_t iovs_len, uint32_t *nwritten);

static char *str = "just testing\n";

void c_main()
{
    struct Ciovec vec = { .buf = (uint8_t*)str, .buf_len = 13 };
    uint32_t nwritten = 0;
    fd_write(1, &vec, 1, &nwritten);
}

现在,如果我使用wasi-sdk将其构建为一个可静态链接的库

代码语言:javascript
复制
~/wasi-sdk-11.0/bin/clang --sysroot ~/wasi-sdk-11.0/share/wasi-sysroot/ lib.c -c -o lib.o -fpic

我得到这个wat:(wasm2wat --enable-all输出)

代码语言:javascript
复制
(module
  (type (;0;) (func))
  (type (;1;) (func (param i32 i32 i32 i32) (result i32)))
  (import "env" "__linear_memory" (memory (;0;) 1))
  (import "env" "__indirect_function_table" (table (;0;) 0 funcref))
  (import "env" "__stack_pointer" (global (;0;) (mut i32)))
  (import "env" "fd_write" (func (;0;) (type 1)))
  ...)

现在fd_write的这个导入行不正确。据我所知,WASI函数需要从wasi_snapshot_preview1wasi_unstable导入(我没有第一个函数的源代码,我只是在开源代码中看到了它,第二个函数参见示例here,但我不确定在C中如何做?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-25 15:33:56

wasi-libc source code中找到了答案

代码语言:javascript
复制
uint16_t fd_write(uint32_t fd, struct Ciovec *iovs_ptr, uint32_t iovs_len, uint32_t *nwritten)
    __attribute__((
                __import_module__("wasi_snapshot_preview1"),
                __import_name__("fd_write"),
                ));

生成的Wasm:

代码语言:javascript
复制
  (import "wasi_snapshot_preview1" "fd_write" (func $fd_write (type 1)))

这仍然不起作用,我得到了undefined symbol: fd_write错误,但至少我现在知道如何指定导入路径。

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

https://stackoverflow.com/questions/63072423

复制
相关文章

相似问题

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