0

让我解释一下我在做什么。我有一个应用程序,我正在嵌入一个 wasm 引擎(特别是 wasmtime)并用 Rust 编写 wasm。目标不是一个浏览器,所以我没有使用 wasm-bindgen。我正在尝试从主机环境中导入两个函数。我已经让它工作了,但有一点黑客,我想删除黑客。这是我遇到的问题。我已经能够弄清楚如何让 Rust 在 wasm 输出中生成导入语句。问题是,如果不使用这些函数,则不包含 wasm 中的 import 语句。Wasmtime 似乎要求传递给 wasm 实例的导入数量与导入语句的数量相匹配。有意义的是,如果 wasm 模块需要导入,那么如果您不提供它们就会出现问题。问题是,如果您提供导入但未使用它们,这也是一个错误。

所以我看到了两种解决方法,要么我需要弄清楚如何让 Rust 包含 import 语句,即使它们没有被使用(现在黑客是调用函数但忽略结果,它基本上是不-op) 或找到一种方法来内省 wasm 以弄清楚它期望什么样的导入,并且只传递它所要求的。

我的问题是正确的方法,如果是这样,你怎么做?

4

2 回答 2

0

您可以使用 WebAssembly Binary Toolkit.wasm在(二进制格式)和.wat(文本格式)之间进行转换。它是开源的。也许它可以帮助您以编程方式提取所需的导入。

正确的方法应该是您的主机环境在初始化实例之前为您提供导入要求。该模块为您提供导入。请参阅“实例变量”。您可以在模块加载和创建本身需要这些导入的实例之间获得它。

于 2021-10-26T16:52:30.890 回答
0

要查找 wasm 模块的导入,您可以使用命令行工具将其转换.wasm.wat并检查 wat 文件(使用 grep 或类似工具)。例如,可以使用wasm-diswhich is part ofbinaryenwasm2watwhich is part of (或者which is part of )。wabtwasm-objdumpwabt

于 2021-10-26T16:53:01.597 回答