我们可以将多个(10多个) .wasm文件合并成一个.wasm文件吗?
发布于 2022-08-11 19:02:12
这可能不是你要找的答案,但它在这里。
我不知道有什么工具可以将wasm文件合并成一个文件。但是,这可能是手动完成的(可能是自动化的)。
您将需要wasm2wat将.wasm文件转换为.wat文件,这是wasm的中间表示形式(就像用于机器代码的程序集)。
每个.wat文件具有以下结构:
(module
;; contains code (functions, types, etc.)
)因此,输出.wat文件应该如下所示:
(module
;; code from the other .wat files, excluding the `(module )`
)因此,您可以在输入文件的开头删除(module,在这些文件的末尾去掉)。然后,将该代码粘贴到输出文件中。
然而,这有一个缺点;您还将复制重复的函数,因此您必须过滤掉这些函数。
希望这至少有一点帮助。
发布于 2022-09-12 09:44:17
发布于 2022-09-14 10:24:26
正如尼古拉所提到的,缺乏“多重记忆”的支持是可靠地做到这一点的主要障碍。
其余的wasm模块“原语”--类型、功能、表、全局、内存、数据、导入、导出--可以通过使用相对简单但完全静态的重命名/重命名方案来避免冲突。我说的比较简单,因为这需要检查和修改func字节码,因此它引用了重命名后的新索引。
这样做的原因之一是已经支持多个表,所以“模块A”中的代码可以使用原始表索引,“模块B”中的代码在合并后可以修补为使用“原始表索引+( mod A中的表计数)”,mod C中的代码将使用“原始表索引+( mod A中的表计数+ mod C中的表计数)”等。(此工作的另一个原因是无法在运行时定义新表--即,每个模块中的表数是静态的,预先知道)
“开始”(入口点)有点不同--你必须选择一个。
不过,“记忆”是个问题。合并后的模块仍然只有一个“内存”,需要在所有合并前模块之间共享。通常,这是不可能的,因为每个模块中的func逻辑都假定它对整个内存空间有完全的控制。
话虽如此,我们还是有可能想出一种合并“内存”的方案,该方案可能对大多数情况下的起作用。(让我们暂时忽略memory64提案 )但是有几个约束:
memory.grow指令,或者如果它包含它,那么内存定义也应该指定最大大小,例如(memory 1 16)。在这些约束条件下,“技巧”依赖于内存load和store指令允许立即偏移arg,例如(i32.load8_u offset=25)。因此,如果已知每个模块的内存使用情况(约束条件确保),则可以通过在每个指令中添加一个合成的offset=来修改每个模块的加载/存储指令的字节代码,这样就不会与迄今合并的所有模块的内存“地址空间”重叠(现有的offset=只需增加这个数量)。
https://stackoverflow.com/questions/73248579
复制相似问题