【问题标题】:Is there a way to inspect a wasm module for imports有没有办法检查 wasm 模块的导入
【发布时间】:2021-10-26 16:36:39
【问题描述】:

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

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

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

【问题讨论】:

    标签: rust webassembly wasmtime


    【解决方案1】:

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

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

    【讨论】:

    • 我一直在这样做以查看何时包含导入。看起来更像是一种黑客攻击,而不是确保它们在那里的无操作调用。
    • 我已经改变了答案。
    • 就是这样。谢谢。我用于目标语言的包装器并没有暴露这一点。我应该直接查看 wasmtime 以查看可用的内容。
    【解决方案2】:

    要查找 wasm 模块的导入,您可以使用将 .wasm 转换为 .wat 的命令行工具并检查 wat 文件(使用 grep 或类似工具)。例如可以使用wasm-dis,它是binaryen 的一部分,或者wasm2wat,它是wabt 的一部分(或者wasm-objdump,它也是wabt 的一部分)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-27
      • 2017-06-12
      • 2021-10-03
      • 2013-09-27
      • 2021-10-15
      • 2021-01-29
      • 2021-12-10
      • 2019-10-30
      相关资源
      最近更新 更多