每个部分末尾的 Webassembly 修复部分大小?

Webassembly fixup section size at the end of every section?

在将 wat 编译为 wasm 时,emscripten 为我提供了每个部分的 FIXUP 大小。在规范中,它从未声明在原始字节码中我们必须在每个部分的末尾包含部分大小。我在这里有点困惑。可以说省略 FIXUP 是否安全,或者背后的原因是什么?节代码之后的节大小是 0。我的意思是你不应该在阅读节之前知道大小吗?没有意义还是没有意义?我觉得两个section size的顺序应该颠倒一下

希望能提供一些见解。

0000029: 00                                        ; section code
000002a: 00                                        ; section size (guess)
000002b: 04                                        ; string length
000002c: 6e61 6d65                                name  ; custom section name
0000030: 01                                        ; function name type
0000031: 00                                        ; subsection size (guess)
0000032: 01                                        ; num functions
0000033: 00                                        ; function index
0000034: 06                                        ; string length
0000035: 6164 6454 776f                           test  ; func name 0
0000031: 09                                        ; FIXUP subsection size
000003b: 02                                        ; local name type
000003c: 00                                        ; subsection size (guess)
000003d: 01                                        ; num functions
000003e: 00                                        ; function index
000003f: 01                                        ; num locals
0000040: 00                                        ; local index
0000041: 00                                        ; string length
000003c: 05                                        ; FIXUP subsection size
000002a: 17                                        ; FIXUP section size

注意左边的字节偏移量:所有标记为 FIXUP 的行都指的是以前写为 0 并标记为 "guesses".

的字节位置

与其他 Wasm 生成器一样,Emscripten 一次性生成二进制文件,这意味着它在必须生成二进制文件时还不知道部分大小。因此它写入 00 并在相应部分完成且其大小已知后对其进行回补。