Open3
WasmLinux: なんかクラッシュする問題
... なんかビルドシステムを更新したらクラッシュするようになった。
とりあえず、macOS(Clang)、Cygwin(gcc11)、Windows(clang-cl)の3 ABIで全く同じクラッシュをするので、コンパイラの問題の線は薄く、たぶん純粋なロジック問題だろう。
破壊されている領域の特定
こういうのは、mallocした領域の外を破壊することで発生する。というわけで、破壊されている場所のアドレスを特定する必要がある。
mplite_getlink
マクロは handle->zPool
から (idx) * handle->szAtom
の領域を読む。ここがfree listに相当するって事かな。
next
は先頭なので、単に int*
のreadということになる。
何度か実行してみると、不正な i
は 0x06000202 、この値を持っているのは zPoolのオフセット 0x3F03E000 で固定なようだ。というわけでデータブレークポイントをここに張ってみる。
wasm2cのinstantiateだった
実際にブレークポイントを入れて実行してみると、何度か正常なアクセスがヒットした後、明かにおかしいヒットがあった:
つまり、ユーザランドのWebAssemblyモジュールをロードするときにポインタを初期化しわすれているか、データ領域用のメモリが足りてないな。。
今は wasm2c_user_max_env_memory
しか確保していない。実際には、
static void init_memories(w2c_user* instance) {
LOAD_DATA((*instance->w2c_env_memory),
(*instance->w2c_env_0x5F_memory_base),
data_segment_data_w2c_user_0x2Edata, 199980);
}
の 199980 バイトは最低限必要になる。 ... とりあえず手動で足しておく。たぶんWasmモジュールを作ったときにデータを抽出しておく必要があるな。。