我尝试调用未知 WebAssembly 的函数 «或者更好地说,我尝试模拟它们» 如果函数有返回值,则获取其返回值。
我无法使用以下代码获得导出,但无法获得它需要哪些参数的任何信息。
instance.exports();
这就是为什么我编写了一个解析器来找出 WebAssembly-File 的函数及其参数的原因。获得这些信息后,我尝试调用导出函数并出现以下错误:
import object field 'env' is not an Object.
及其标题:
(import "env" "DYNAMICTOP_PTR" (global $env.DYNAMICTOP_PTR i32))
(import "env" "STACKTOP" (global $env.STACKTOP i32))
(import "env" "STACK_MAX" (global $env.STACK_MAX i32))
(import "env" "abort" (func $env.abort (type $t1)))
(import "env" "enlargeMemory" (func $env.enlargeMemory (type $t2)))
(import "env" "getTotalMemory" (func $env.getTotalMemory (type $t2)))
(import "env" "abortOnCannotGrowMemory" (func $env.abortOnCannotGrowMemory (type $t2)))
(import "env" "_gmtime" (func $env._gmtime (type $t3)))
(import "env" "___setErrNo" (func $env.___setErrNo (type $t1)))
(import "env" "_emscripten_memcpy_big" (func $env._emscripten_memcpy_big (type $t4)))
(import "env" "___syscall20" (func $env.___syscall20 (type $t5)))
(import "env" "_ftime" (func $env._ftime (type $t3)))
(import "env" "memory" (memory $env.memory 256 256))
(import "env" "table" (table $env.table 8 8 anyfunc))
(import "env" "memoryBase" (global $env.memoryBase i32))
(import "env" "tableBase" (global $env.tableBase i32))
原因很明确:因为我没有定义任何导入对象。我有以下想法来解决这个问题:
我定义了 importObject 以使其满足最低要求。我找到了一些导入的以下代码:
table: new WebAssembly.Table({ initial: 0, maximum: 0, element: 'anyfunc' }),
tableBase: 0,
memory: memory,
memoryBase: 1024,
STACKTOP: 0,
STACK_MAX: memory.buffer.byteLength,
但是有太多不同的导入。我找不到一个列表,它给了我所有的导入类型和它们的定义。这就是为什么我想创建自己的表来解决这个问题。你能给我一些信息或者帮我做这张 table 吗?
最佳答案
I couldn't find a list, which gives me all import types and their definition
您找不到这样的列表是因为它不存在!
WebAssembly 模块可以导入或导出函数(以及表、内存和全局变量)。您选择导入或导出的内容完全取决于您,并且取决于您尝试使用 WebAssembly 模块实现的目标。仅将两个数字加在一起的简单模块可能会导出单个 add
函数。
从您的代码示例来看,您似乎正在使用 Emscripten,它在您的 WebAssembly 模块周围添加了大量基础设施/框架代码。由于此代码通常不被视为其 API 的一部分,您可能需要深入研究代码以确定导入对象的外观:
https://github.com/kripken/emscripten/blob/78b44ed55cc4d0b4d79f62df9e80ae6f29a5345b/src/preamble.js
关于javascript - 尝试调用未知 WebAssembly 的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48992357/