如何在使用 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
用wabt
的wasm2wat
检查编译的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]
将是 module
的 i
次进口)。
(我同意 Wasm C/C++ API 目前非常准系统。 Unless/until 已更改,您必须自己构建任何便利机制。这就是全部可用的信息可能,它显然不如从 JavaScript 实例化 Wasm 模块方便。)
我正在尝试将 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
用wabt
的wasm2wat
检查编译的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]
将是 module
的 i
次进口)。
(我同意 Wasm C/C++ API 目前非常准系统。 Unless/until 已更改,您必须自己构建任何便利机制。这就是全部可用的信息可能,它显然不如从 JavaScript 实例化 Wasm 模块方便。)