ぱたへね

はてなダイアリーはrustの色分けができないのでこっちに来た

WebAssembly FileのKnown sections

WebAssembly in ActionからWebAssembly Fileの構造についての続き。

www.manning.com

その1の続き

natsutan.hatenablog.com

本はバイナリのフォーマットで説明されていますが、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との違いは良く分からない。