问题标签 [wasi]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
62 浏览

rust - 重用从 Rustc 生成的 LLVM 位码

我想在另一个 Rust 项目中重用从 rustc 生成的 LLVM 位码,两者都针对 wasm32-wasi。我将描述事实:

  • 我有一个生成验证码的库 (A)。当我将此库直接编译为 wasm32-wasi 时,它编译没有问题,甚至可以使用 wasmer 或 wasmtime 执行。
  • 我有另一个使用验证码生成函数作为外部依赖项的 Rust 应用程序(我们称之为 Harness)。
  • 我保存了 A 的中间 llvm 位码,我对其进行了一些分析,我想在 Harness 中再次将其作为外部函数重用。
  • 当我尝试使用 链接从 A 保存的 llvm 时RUSTFLAGS="-C link-arg=A.bc",它会将 Harness 应用程序生成为 Wasm 包,但似乎存在损坏问题。A 使用的一些函数现在作为导入注入。
  • Harness 应用程序与 A 具有相同的依赖关系,因此,理论上这些函数也可以注入,并且不需要导入 A 在 Wasm 模块中使用的一些函数。

关于如何摆脱重整的任何想法?或者,有一种真正的方法可以获取中间 llvm 位码并在另一个应用程序中再次链接它们。

提前致谢

0 投票
0 回答
207 浏览

go - 从 wasm 函数返回多个值

我有一个在本地运行并连接到 wasm 模块的 Golang TCP 服务器。目前,我可以从 wasm 函数返回一个值。通过这个博客,我注意到应该有可能返回多个值而不是一个。但是,在我的 Go TCP 服务器中,我没有从 wasm 函数中得到任何响应。

这就是我返回一个值的方式,它工作正常:

在 Go 服务器中:

以下是我如何尝试从 wasm 函数返回多个值:

在 Go 服务器中,我添加了以下代码行:

其余的和以前一样:

我使用命令编译了 wasm 模块cargo wasi build,它编译得很好。但是,当向与 wasm 模块对话的 Go 服务器发送请求时,我收到一个错误,提示got 2 expected 3 arguments. 我不明白第三个论点应该是什么。

0 投票
1 回答
100 浏览

webassembly - WASI 函数的 ABI 格式

我正在构建一个 Webassembly 运行时,目前正在实现 WASI API。根据这份文档,我想知道 ABI 的外观如何:https ://github.com/WebAssembly/WASI/blob/main/phases/snapshot/docs.md

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

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

带有类型签名:

根据规范,该函数具有映射到 POSIX 系统调用fd_write的签名。 fd_write(fd: fd, iovs: ciovec_array) -> Result<size, errno>ssize_t writev(int fd, const struct iovec *iov, int iovcnt);

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

0 投票
0 回答
120 浏览

c++ - 我应该使用 wasi-libc 从浏览器 WebAssembly 代码中访问标准库函数吗?

我正在尝试将 WebAssembly 和 libc++ 用于浏览器应用程序。我已经成功地将 libc++ 头文件添加到我的 C++ 代码中并对其进行了编译。在不链接 libc++ 的情况下,需要将一些函数从 JS 导入到 wasm(memcpy、operator new...)。但是,如果我将 clang libc++ 链接到我的代码,则会在链接时出现错误“wasm-ld unknown file type new.cpp.o”。好的,这很清楚。

如果我链接 wasi-libc 并使用它的头文件,一切正常。但我知道,如果我不想在任何地方运行我的代码,而只能在浏览器上运行,我应该使用 wasm 而不是 wasi。这是真的吗?如果是,将 libc++ 链接到我的代码的正确方法是什么?

0 投票
1 回答
42 浏览

webassembly - Wasmtime WASI 通过 HTTP/sockets 通信

有一个很棒的名为 Wasmtime 的 webassembly 编译器和虚拟机,它提供对执行的支持而无需任何嵌入,它允许从命令行直接运行 WASM 应用程序https://docs.wasmtime.dev/lang-bash.html

不幸的是,没有通过 WASI 执行 HTTP/网络通信的官方方法,因为 WASI 预览快照中不存在 HTTP/套接字,因此通过 Wasmtime 开发任何有用的应用程序都是有问题的

纯理论上不可能运行一些代理网络服务器,它从主机发出真正的 TCP 连接并通过自定义协议通过文件系统与 Wasmtime 应用程序通信,但它似乎过于复杂并且可能会影响性能不佳

有像https://github.com/deislabs/wasi-experimental-http这样的解决方案,但它不适合,因为需要在 Rust 中编写自定义入口点,安装 Rust 工具链并为一堆目标平台编译它,而不是下载独立的 executalbe来自受信任网站的文件https://wasmtime.dev/

几周前我打开了问题https://github.com/bytecodealliance/wasmtime/issues/3483,但不幸的是没有进展或答案

因此,Wasmtime 团队的主要任务是:如果任何通信功能不可用,那么使用 Wasmtime 运行时开发读取世界应用程序意味着什么?同时,像神经网络这样的外来扩展也在积极开发中,但是 HTTP/原始套接字支持是 MVP 的主要部分

谢谢

0 投票
0 回答
63 浏览

webassembly - 如何在 WASM WAT 中导入 WASI 并编写简单的控制台日志功能

我想了解用于教育目的的 WebAssembly 文本格式以及编写直接编译为 WASM 的 POC 编译器。

我想了解如何正确导入必要的 WASI 函数来创建控制台日志函数。

我很想看到一个用有点可读的 WAT 模块编写的示例,该模块导入 WASI 并实现一个可以在浏览器外部运行的简单控制台 log/printf/echo 函数。

例如,