wasmバイナリのカスタムセクションを書いてみる - @ledsun blog でプリアンブルとセクションを持つwasmバイナリを書き出せるようになりました。 最低限のwasmバイナリファイルの構造を理解したといえます。
お題
Writingの次はReadingです。 シンプルなwasmバイナリを作って読んでみましょう。
WebAssemblyにはテキストフォーマットがあります。 たとえば、最小では次の文字列です。
(module)
このテキストフォーマットからどのようなwasmバイナリが生成されるのでしょうか?
- プリアンブルだけのバイナリ
0x00 0x61 0x73 0x6D 0x01 0x00 0x00 0x00
になる - 何かしらのセクションがつく
どちらになるでしょうか?
手法
WebAssembly text formatからwasmバイナリを生成してみましょう。 Converting WebAssembly text format to Wasm - WebAssembly | MDNによると、wabtというwasmバイナリ用のツールがあるようです。 これを使えばテキストフォーマットからwasmバイナリが作れそうです。
wabtのインストール
わたしの環境はWSL上のubuntuです。
リポジトリのClone
git clone --recursive https://github.com/WebAssembly/wabt cd wabt git submodule update --init
ビルドツールのインストール
CMakeとninja-buildが必要です。 それぞれインストールします。
CMake
sudo apt install cmake
確認
►cmake --version cmake version 3.22.1 CMake suite maintained and supported by Kitware (kitware.com/cmake).
ninja-build
sudo apt install ninja-build
確認
►ninja --version 1.10.1
ビルド
make
確認
►bin/wat2wasm --version 1.0.33 (git~1.0.33-31-gbceb2434)
検証
wabtにふくまれるwat2wasmを使って、WebAssembly text formatからwasmバイナリを生成します。
バイナリファイルを生成
echo '(module)' > minimam.wat ~/wabt/bin/wat2wasm minimam.wat -o minimam.wasm
バイナリファイルを確認
►hexdump -C minimam.wasm 00000000 00 61 73 6d 01 00 00 00 |.asm....| 00000008
正解は 1. プリアンブルだけのバイナリ 0x00 0x61 0x73 0x6D 0x01 0x00 0x00 0x00
になる でした。