当编译到WebAssembly时,emscripten会生成像invoke_vii这样的函数。他们的目的是什么?
详细信息:
使用WebAssembly环境从C编译而来的emcc -s WASM=1 -g模块期望主机环境提供各种功能。
...
(import "env" "abortOnCannotGrowMemory" (func $import$9 (result i32)))
(import "env" "invoke_vii" (func $import$10 (param i32 i32 i32)))
(import "env" "___syscall221" (func $import$11 (param i32 i32) (result i32)))
...我正在编写用C语言编写的WebAssembly解释器,所以我必须处理提供这些函数的问题,但是我对诸如invoke_vii、invoke_iiii等类似的函数感到困惑。
后缀显然与呼叫签名有关。例如,vii的意思是返回void并取一些int的名称,这个名称表示函数应该调用某些东西。
除了在emscripten生成的Java脚本代码中找到这些函数的实现之外,我找不到其他有关这些函数的信息:
function invoke_ii(index,a1) {
# removed error checking for brevity
return Module["dynCall_ii"](index,a1);
}dynCall_ii存在于WebAssembly模块中。
invoke_*函数所做的似乎只是指示解释器运行相应的dynCall_*函数。这种间接的目的是什么?为什么WebAssembly代码不直接调用dynCall_?
发布于 2020-09-29 05:16:47
它们用于处理setjmp/longjmp以及C++异常。在这些机制中,JavaScript需要能够调用WebAssembly并调用WebAssembly间接函数表中的函数。
如果您没有异常地进行构建,并且使用-s SUPPORT_LONGJMP=0 (不是默认的),那么您根本就不会看到任何这些函数。
https://stackoverflow.com/questions/45511465
复制相似问题