Open3

WasmLinux: なんかクラッシュする問題

okuokuokuoku

... なんかビルドシステムを更新したらクラッシュするようになった。

とりあえず、macOS(Clang)、Cygwin(gcc11)、Windows(clang-cl)の3 ABIで全く同じクラッシュをするので、コンパイラの問題の線は薄く、たぶん純粋なロジック問題だろう。

okuokuokuoku

破壊されている領域の特定

こういうのは、mallocした領域の外を破壊することで発生する。というわけで、破壊されている場所のアドレスを特定する必要がある。

https://github.com/okuoku/wasmlinux-runner/blob/f8befbc39e9eb791b954475d964a652814aec59b/hostrunner/mempoolite/mplite.c#L38-L39

mplite_getlink マクロは handle->zPool から (idx) * handle->szAtom の領域を読む。ここがfree listに相当するって事かな。

https://github.com/okuoku/wasmlinux-runner/blob/f8befbc39e9eb791b954475d964a652814aec59b/hostrunner/mempoolite/mplite.c#L16-L21

next は先頭なので、単に int* のreadということになる。

何度か実行してみると、不正な i は 0x06000202 、この値を持っているのは zPoolのオフセット 0x3F03E000 で固定なようだ。というわけでデータブレークポイントをここに張ってみる。

okuokuokuoku

wasm2cのinstantiateだった

実際にブレークポイントを入れて実行してみると、何度か正常なアクセスがヒットした後、明かにおかしいヒットがあった:

つまり、ユーザランドのWebAssemblyモジュールをロードするときにポインタを初期化しわすれているか、データ領域用のメモリが足りてないな。。

https://github.com/okuoku/wasmlinux-runner/blob/f8befbc39e9eb791b954475d964a652814aec59b/hostrunner/runner.cpp#L534-L535

今は 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モジュールを作ったときにデータを抽出しておく必要があるな。。