如何在使用 emcc 从 c++ 编译的 wee8 wasm 代码中 运行? (wee8 的 WASI?)

How to run in wee8 wasm code that was compiled from c++ with emcc? (WASI in wee8?)

我正在尝试将 C++ 代码编译为 wasm,然后使用 wee8(v8 的 wasm-api)将其嵌入到其他 C++ 代码中。目前我在实例化模块时遇到段错误:

    auto instance = wasm::Instance::make(store, module.get(), imports);

请注意,嵌入我编写为 .wat 并转换为 .wasm 的代码没有问题,因此问题特别在于使用 emcc 编译的嵌入代码。 我猜 我缺少的是 wee8 中的 WASI 支持?它存在吗? 我怎样才能启用它?或者:我可以要求 emcc 不生成任何 WASI 调用吗?

这是一个最小的例子,结果是:

Process finished with exit code 139 (interrupted by signal 11: SIGSEGV)

在cpp42.cpp中:

int main() {
    return 42;
}

将其编译为 wasm:

emcc -O3 cpp42.cpp -o cpp42.wasm

wabtwasm2wat检查编译的wasm模块表明它包含以下导入

  (import "wasi_snapshot_preview1" "proc_exit" (func (;0;) (type 0)))

我怀疑这是问题的原因。

然后像 repo 中的示例一样嵌入 wee8,就像我对其他 wasm 文件所做的那样会导致上述段错误。

就像另一张支票一样:运行

wasmer cpp42.wasm 
echo $?
> 42

工作没有问题。

我可以回答你的部分问题:

I'm missing is WASI support in wee8? Does it exist?

不,wee8 没有实现 WASI。添加此类支持在理论上是可行的,但目前未按计划完成。

您可以在您的 wee8 嵌入器中自己实现它,并通过导入使其可用于加载的模块。它的大部分(或全部?)可能是一个可重用的(在许多引擎实现中)库,可能由 WASI 项目本身提供和维护。 (不知道有没有这样的库。)

您没有说出您当前传递的 imports 对象;它需要是一个 wasm::Extern* 指针数组,至少与 module 的导入一样长,并且顺序相同(即 imports[i] 将是 modulei次进口)。

(我同意 Wasm C/C++ API 目前非常准系统。 Unless/until 已更改,您必须自己构建任何便利机制。这就是全部可用的信息可能,它显然不如从 JavaScript 实例化 Wasm 模块方便。)