WebAssembly in ActionからWebAssembly Fileの構造についての続き。
その1の続き
本はバイナリのフォーマットで説明されていますが、S式に変換した方が分かりやすい。 wasm2watコマンドを使うとリーダブルなS式に変換できるので、それで中身を確認しました。 S式に変換するときに、ちょっと変わっている気がするので後でちゃんと調査したい。
Type
Tyep sectionは、関数のシグネチャを記載しています。 引数と戻り値が記載されています。
(type (;0;) (func (result i32))) (type (;1;) (func (param i32) (result i32))) (type (;2;) (func)) (type (;3;) (func (param i32))) (type (;4;) (func (param i32 i32 i32) (result i32))) (type (;5;) (func (param i32 i64 i32) (result i64)))
Import
Import sectionは、モジュールで使われるFunction、Table、Memory、Global Importの宣言です。
(import "wasi_snapshot_preview1" "proc_exit" (func (;0;) (type 3)))
Function
関数のlist。S式には見つからず。
Table
型付き配列のリファレンスを記載しています。
(table (;0;) 2 2 funcref)
Memory
リニアなメモリの記載です。
(memory (;0;) 256 256)
Global
グローバル変数の定義です。
(global (;0;) (mut i32) (i32.const 5243936))
Export
Exportされるシンボル情報です。
(export "memory" (memory 0)) (export "__indirect_function_table" (table 0))
Start
このセクションは手持ちのファイルには見つからず。 多分、最初に呼ばれる関数のインデックス。普通にCで書くとmainになりそう。(未確認)
Element
インスタンスが生成されるときにロードされる値。Global変数。
(elem (;0;) (i32.const 1) func 1))
Code
関数の中身。多分S式に出てくるfuncだと思う。
(func (;1;) (type 2) nop)
ここのtype2が、Type section の (type (;2;) (func)) に対応しています。 この場合はC言語の void f(void) {} ですかね。
Data
こちらも見つからず。インスタンスが生成されるときにロードされる値と書いてあるが、Elmentとの違いは良く分からない。