2022年11月6日日曜日

C プログラムを WASI 向けの Wasm としてビルドし、 WasmEdge で実行する

そのうち Docker で Wasm コンテナが実行できるようになる(Docker DesktopがWebAssemblyランタイムを統合。コンテナと同様にWebAssemblyイメージを実行可能に - Publickey)らしいので、Wasm のビルドと実行を試してみる。

前提

  • OS: Windows 11 Pro 22H2 ビルド: 22621.755
  • Docker: Docker Desktop 4.13.1 (90346)
  • 使用イメージ: debian:bullseye-slim

イメージ起動

docker run -it --rm debian:bullseye-slim

環境構築

前提ツール類インストール

apt-get update
apt-get install -y curl git libxml2 file
  • curl : WasmEdge のインストールに必要
  • git : WasmEdge のインストールに必要
  • libxml2 : Wasm バイナリのビルドに必要なライブラリ
  • file : ビルドしたバイナリが Wasm バイナリになっているかを確認するために使用

wasi-sdk のインストール

Wasm のコンパイルに必要な SDK をインストールする。

curl -LO https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-16/wasi-sdk_16.0_amd64.deb
apt-get install -f ./wasi-sdk_16.0_amd64.deb

/opt/wasi-sdk/ にインストールされる。

WasmEdge のインストール

Wasm 実行に必要なランタイムをインストールする。

curl -sSf https://raw.githubusercontent.com/WasmEdge/WasmEdge/master/utils/install.sh | bash

~/.wasmedge にインストールされる。

ビルド

C のソースコードを作成

cat << EOF >> main.c
#include <stdio.h>

int main(int argc, char **argv) {
    printf("Hello, World!\n");
    return 0;
}
EOF

clang によるビルド

/opt/wasi-sdk/bin 内に clang があるので、それを使ってビルド。

/opt/wasi-sdk/bin/clang main.c --sysroot=/opt/wasi-sdk/share/wasi-sysroot/ -o ./main.wasm

バイナリの確認

file コマンドで確認すると、 WebAssembly であることが確認できる。

# file main.wasm
main.wasm: WebAssembly (wasm) binary module version 0x1 (MVP)

実行

wasmedge に、ビルドしたバイナリを渡す。

# ~/.wasmedge/bin/wasmedge ./main.wasm
Hello, World!

実行できた。以上。

参考資料

0 件のコメント:

コメントを投稿