我正在尝试根据webassembly的模块结构文档识别wasm二进制模块的每个部分。我已经做了一部分认可,如下所示:
截图
红色代码被标记为"魔术代码";
深橙色代码标记为"版本号";
浅黄色代码标记为第一部分的"ID";
深绿色的代码被标记为"有效载荷长度",采用"Variint7"格式;
我不确定如何识别接下来的以下部分,对哪个部分是"有效载荷数据"有点困惑?在官方文档中写道的"最后一个当前部分的末尾必须与模块的最后一个字节一致"的含义是什么。
我建议查看现有的WebAssembly二进制解析器来帮助理解。这是WebKit的一个。
每个部分都以特定于部分的方式解码,如二进制格式文档中所述。您查看id
和payload_length
,然后根据部分 ID 解码相应的部分。从该页面开始,部分编号为:
- 类型
- 进口
- 功能
- 桌子
- 记忆
- 全球
- 出口
- 开始
- 元素
- 法典
- 数据
此外,0 是"自定义"。
转到每个部分的描述以了解如何解码它们。
"最后一个当前部分的末尾必须与模块的最后一个字节一致",这意味着如果您解码一个部分,并且解码的长度与有效负载数据不匹配,则这是一个验证错误。