让我解释一下我在做什么。我有一个应用程序,我正在嵌入一个wasm引擎(特别是wasmtime),并用Rust编写wasm。目标是而不是浏览器,所以我没有使用wwasm -bind。我试图从主机环境导入两个函数。我已经让它工作了,但有一点hack,我想删除hack。这就是我遇到的问题。我已经能够弄清楚如何让Rust在wasm输出中生成import语句。问题是,如果不使用这些函数,则不包括asm中的import语句。wasm似乎要求传递给wasm实例的导入数量与导入语句的数量相匹配。有道理的是,如果wasm模块期望导入,那么如果不提供它们就会出现问题。问题是,如果你提供的导入没有被使用,这也是一个错误。
所以我看到了两种方法来解决这个问题,要么我需要弄清楚如何让Rust包括import语句,即使它们不被使用(现在的hack是调用函数但忽略结果,这基本上是一个无操作),要么找到一种方法来自省asm,找出它期望什么样的导入,只传递它所要求的。
我的问题是,这是正确的方法吗?如果是,你怎么做?
您可以使用the WebAssembly binary Toolkit在.wasm
(二进制格式)和.wat
(文本格式)之间进行转换。它是开源的。也许它可以帮助您以编程方式提取所需的导入。
正确的方法应该是在初始化实例之前让您的主机环境为您提供导入需求。模块为您提供了导入。请参阅"实例变量"。您可以在模块加载和实例本身需要这些导入的创建之间获得这些。
要查找wasm模块的导入,您可以使用命令行工具将.wasm
转换为.wat
并检查wat文件(使用grep或类似工具)。例如,wasm-dis
是binaryen
的一部分,wasm2wat
是wabt
的一部分,或者wasm-objdump
也是wabt
的一部分。