问题标签 [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.
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 位码并在另一个应用程序中再次链接它们。
提前致谢
go - 从 wasm 函数返回多个值
我有一个在本地运行并连接到 wasm 模块的 Golang TCP 服务器。目前,我可以从 wasm 函数返回一个值。通过这个博客,我注意到应该有可能返回多个值而不是一个。但是,在我的 Go TCP 服务器中,我没有从 wasm 函数中得到任何响应。
这就是我返回一个值的方式,它工作正常:
在 Go 服务器中:
以下是我如何尝试从 wasm 函数返回多个值:
在 Go 服务器中,我添加了以下代码行:
其余的和以前一样:
我使用命令编译了 wasm 模块cargo wasi build
,它编译得很好。但是,当向与 wasm 模块对话的 Go 服务器发送请求时,我收到一个错误,提示got 2 expected 3 arguments
. 我不明白第三个论点应该是什么。
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?
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++ 链接到我的代码的正确方法是什么?
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 的主要部分
谢谢
webassembly - 如何在 WASM WAT 中导入 WASI 并编写简单的控制台日志功能
我想了解用于教育目的的 WebAssembly 文本格式以及编写直接编译为 WASM 的 POC 编译器。
我想了解如何正确导入必要的 WASI 函数来创建控制台日志函数。
我很想看到一个用有点可读的 WAT 模块编写的示例,该模块导入 WASI 并实现一个可以在浏览器外部运行的简单控制台 log/printf/echo 函数。
例如,