让我解释一下我在做什么。我有一个应用程序,我正在嵌入一个wasm引擎(特别是wasmtime)并用Rust编写wasm。目标不是浏览器,所以我不使用wasm-bindgen。我正在尝试从主机环境导入两个函数。我已经让它开始工作了,但是有一点小问题,我想把它移除。这就是我遇到的问题。我已经找到了如何让Rust在wasm输出中生成导入语句。问题是,如果不使用这些函数,就不包括wasm中的import语句。Wasmtime似乎要求传递给wasm实例的导入数与import语句的数量相匹配。有道理的是,如果wasm模块期望导入,那么如果不提供它们,就会出现问题。问题是,如果您提供导入而不使用它们,这也是一个错误。
所以我看到了两种解决这个问题的方法,要么我需要弄清楚如何让Rust包含导入语句,即使它们没有被使用(现在的黑客是调用函数,但忽略结果,这基本上是一个不操作),或者找到一种方法来自省它期望的是什么样的导入,并且只传递它所要求的。
我的问题是,这是正确的方法,如果是的话,你是如何做到的?
发布于 2021-10-26 16:52:30
您可以使用.wasm (二进制格式)和.wat (文本格式)与WebAssembly二进制工具包进行转换。是开源。也许它可以帮助您以编程方式提取所需的导入。
正确的方法应该是在初始化实例之前,主机环境为您提供导入需求。模块为您提供了导入。参见“实例变量”。您可以在模块加载和创建自身需要这些导入的实例之间获得这些信息。
发布于 2021-10-26 16:53:01
要查找wasm模块的导入,可以使用命令行工具将.wasm转换为.wat并检查wat文件(使用grep或类似的)。例如,wasm-dis是binaryen的一部分,wasm2wat是wabt的一部分(或者wasm-objdump也是wabt的一部分)。
https://stackoverflow.com/questions/69726917
复制相似问题