首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将多个.wasm文件合并成一个.wasm文件

将多个.wasm文件合并成一个.wasm文件
EN

Stack Overflow用户
提问于 2022-08-05 10:50:19
回答 3查看 238关注 0票数 0

我们可以将多个(10多个) .wasm文件合并成一个.wasm文件吗?

EN

回答 3

Stack Overflow用户

发布于 2022-08-11 19:02:12

这可能不是你要找的答案,但它在这里。

我不知道有什么工具可以将wasm文件合并成一个文件。但是,这可能是手动完成的(可能是自动化的)。

您将需要wasm2wat.wasm文件转换为.wat文件,这是wasm的中间表示形式(就像用于机器代码的程序集)。

每个.wat文件具有以下结构:

代码语言:javascript
复制
(module
  ;; contains code (functions, types, etc.)
)

因此,输出.wat文件应该如下所示:

代码语言:javascript
复制
(module
  ;; code from the other .wat files, excluding the `(module )`
)

因此,您可以在输入文件的开头删除(module,在这些文件的末尾去掉)。然后,将该代码粘贴到输出文件中。

然而,这有一个缺点;您还将复制重复的函数,因此您必须过滤掉这些函数。

希望这至少有一点帮助。

票数 1
EN

Stack Overflow用户

发布于 2022-09-12 09:44:17

有一个项目,但显然,它被认为是未充分使用

您不能“只是”复制/粘贴两个或多个模块的WebAssembly文本序列化,并期望它能够工作。内部的不同对象(功能、全局等)通过索引访问(称为/get/set),而不仅仅是通过名称访问。如果多记忆方案是可操作的,则必须完全处理这些模块并合并它们。但这是还没有准备好

票数 1
EN

Stack Overflow用户

发布于 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)
  • 合并的所有模块的总内存使用量不应溢出memory32大小限制,即4 GiB。

在这些约束条件下,“技巧”依赖于内存loadstore指令允许立即偏移arg,例如(i32.load8_u offset=25)。因此,如果已知每个模块的内存使用情况(约束条件确保),则可以通过在每个指令中添加一个合成的offset=来修改每个模块的加载/存储指令的字节代码,这样就不会与迄今合并的所有模块的内存“地址空间”重叠(现有的offset=只需增加这个数量)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73248579

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档