问题标签 [wasmtime]
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.
windows - 在 Windows 10 中构建 wasmtime 失败
我尝试在 Windows 10 中构建wasmtime但失败了。
运行命令后cargo build --release
,我收到错误消息:
找不到 sys/ioctl.h和pthread.h文件。
我安装了MinGW、CMake和LLVM。我是否需要安装其他与 Linux 相关的工具来构建它?
clang - 使用 wasi-libc 时 fopen 失败
我尝试在使用fopen
时读取图像wasi-libc
:
使用 Clang 构建代码:
它返回 NULL。我该如何解决这个问题?
cmd - 无法在 cmd 上运行 wasm 模块。错误:无法运行主模块“demo.wasm”
嗨,我是编程新手,一般我只知道网络开发。所以我有兴趣使用 webassembly wasm、wasmp-pack、webpack、wasi 开发 rust,在这种情况下是 wasmtime 的运行时演示,但我卡在这里,严重的是我什至不知道从哪里开始,所以这是错误...
webassembly - 为什么 WebAssembly 是安全的,什么是线性内存模型
(1) 我听说 WebAssembly 的安全性是通过提供线性内存来实现的。我想知道这个线性内存包含什么?wasm 堆栈和堆是否位于此内存空间中?如果是,我认为 wasm 堆栈和胶水代码堆栈(例如,js python 等)是分开的,对吗?
(2) 我可以通过使用导入表来了解 wasm 的内存安全性。换句话说,wasm 函数不能调用线性内存之外的任何函数,因为它只能使用索引来调用导入的函数。除此之外,wasm 还提供哪些其他安全性?也许是来自上面的堆栈问题。
(3) 看起来 wasm 中也有控制流完整性。也就是说每个函数的返回地址都是固定的,不能在这个函数内部修改。这是一个正确的理解吗?
非常感谢!
node.js - WASM 中的环境检测:Web、Node.js 还是独立运行时?
运行 WebAssembly 模块的方式有很多种,除了 Web 之外,Node.js 可以加载 wasm 模块--experimental-wasm-modules
,独立运行时如 wasmtime 和 lucet 也可以运行它。
那么如何检测 WASM 中的当前环境,是否可以对 wasm 模块应用限制,使其只能在特定网站上运行?
go - 如何使用字符串作为参数从 Go 调用 Rust 函数?
我一直在尝试将字符串传递给 Rust 函数(编译为 Wasm),但是据我所知,现在无法直接传递字符串,因为“str”不是“FFI 世界”中的类型(至少 rust 编译器是这么说的):
= help: consider using `*const u8` and a length instead
所以我所做的就是将函数更改为这种形式(而不是使用简单的 &str 类型):
这意味着我需要一个指针和 u8 中字符串的长度。
但是,有人让我注意到 WASM 模块是沙盒的,因此它们不能像普通应用程序那样使用普通指针。因此,我必须使用这样的函数将内存分配到模块的线性内存中:
这是一个 JS 函数的例子,它使用了这样的 alloc 函数:
我的问题是我不知道如何将此函数转换为 Go,这是因为我被困在“var mem”行,原因如下:
- 我在 Go 中找不到“instance.exports.memory.buffer”的等价物(实例是“*wasmtime.Instance”类型)。
- 我不知道如何去做 Unit8Buffer 在 Go 中所做的事情。
关于 Wasm 内存的好读物:(https://radu-matei.com/blog/practical-guide-to-wasm-memory/#exchang-strings-between-modules-and-runtimes)
assembly - 寄存器使用和 WASM 编译器
我在 x86_64 上使用 Ubuntu。我首先从 clang 生成未优化的 WebAssembly 代码。WebAssembly 代码被编译成机器代码wasmtime
,cranelift
用作编译后端。
我正在做一个简单的矩阵乘法:
这是三个循环中第一个循环的机器代码
由 生成wasmtime
。我找到了许多必要的说明,但我找不到起重机升降机的调用约定来需要这些说明。
我的问题主要是关于
esi
寄存器,编译器是否必须使用它来获取c
使用esi
. 的价值必须esi
保留吗?不然为什么不直接用它来做cmp
。如果是,为什么1ad
我们使用 esi 来存储来自r14d
哪个来自的0eax
?此外,0 值保存在 中eax
,eax 也是非易失性寄存器吗?中
1b0
,如果我们直接cmp esi, r12d
根据结果设置 esi 0 或 1,就不需要复杂的步骤了1ba
——1c3
对吧?如果我使用优化的 WebAssembly 生成优化的机器代码
我不认为cranelift本身提供了优化标志,我发现机器代码更短但也很难理解。有什么方法可以帮助我阅读优化的机器代码?而且,如果我的机器代码来自未优化的 wasm。根据我们刚才对这个for循环例子的分析,可以说我找到了wasm编译器cranelift的缺陷吗?
非常感谢你的帮助!我知道代码可能读起来不愉快,你可以放大页面看图片
sandbox - 主机可以选择将哪些系统调用传递给每个 webassembly 模块
在https://hacks.mozilla.org/2019/03/standardizing-wasi-a-webassembly-system-interface/中 Lin Clark 的部分谈话:
它还为我们提供了沙盒,因为主机可以逐个程序选择要传入的 wasi 核心函数——因此,允许哪些系统调用。这保持了安全性。
她说主机可以选择传递给每个wasm
模块的系统调用。例如read()
系统调用传递到module A
和write()
系统调用到module B
。
它是在或其他运行时实现的wasmtime
吗lucet
?或者它只是一个没有在现实世界中实现的梦想?
rust - 在 Rust WebAassembly (wasmtime) 的主机导入函数中传递一个指针字符串作为参数
所以我在生成的 .wast 文件中有以下导入(免责声明:我自己没有编写 wasm 文件):
我需要在 Rust 中编写主机导入函数。我不能在 Rust 中使用 &str,而且导入需要 i32。我猜我需要传递一个指向字符串的指针,在 Rust 中定义?谁能指出我正确的方向?在 wasmtime 中完成的一些例子?
提前致谢!