WebAssembly モジュールをポータブル C に変換します。wabt の wasm2c からインスピレーションを受けています。
とらえどころのないユニバーサル バイナリとしての WebAssembly に向けた取り組み:
↗ different
source code → WebAssembly → C89 → OSes,
(C++, Rust, ...) ↘ CPUs
names
カスタム セクションで指定されている場合).debug_line
カスタム セクションで提供されている場合)。 libdwarf をインストールする必要があります。以下の手順を参照してください。システムが少なくとも CMake 2.8.12 でサポートされている場合は、CMake を使用して機能を検出することを優先します。 CMake のないシステムでは、Make を使用することもできます。
cd w2c2
cmake -B build
cmake --build build
cd wasi
cmake -B build
cmake --build build
たとえば、 module.wasm
module.c
(およびmodule.h
) にコンパイルするには、次のようにします。
./w2c2 module.wasm module.c
w2c2 は、モジュールを個別の C ファイルにコンパイルできます。これは、大規模なモジュールをコンパイルする場合やリソースが限られているホスト上で行うことをお勧めします。
たとえば、 module.wasm
(およびmodule.h
) を、それぞれ 100 個の関数を含む複数のファイルにコンパイルするには、次のようにします。
./w2c2 -f 100 module.wasm module.c
w2c2 がスレッド化サポートを使用してビルドされた場合、モジュールを並列でコンパイルできます。デフォルトでは、w2c2 は利用可能な CPU コアと同じ数のワーカー スレッドを生成します。
ワーカー スレッドの数を手動で指定するには、 -t
フラグを使用して数値を渡します。
たとえば、2 つのスレッドを使用してコンパイルするには:
./w2c2 -t 2 module.wasm module.c
コアマーク:
cd examples/coremark
make
./coremark
Python 3 と wabt ( wast2json
の場合) が必要です。
cd tests
make gen
make run-tests
args_get
args_sizes_get
clock_res_get
clock_time_get
environ_get
environ_sizes_get
fd_advise
fd_allocate
fd_close
fd_datasync
fd_fdstat_get
fd_fdstat_set_flags
fd_fdstat_set_rights
fd_filestat_get
fd_filestat_set_size
fd_filestat_set_times
fd_pread
fd_prestat_get
fd_prestat_dir_name
fd_pwrite
fd_read
fd_readdir
fd_renumber
fd_seek
fd_sync
fd_tell
fd_write
path_create_directory
path_filestat_get
path_filestat_set_times
path_link
path_open
path_readlink
path_remove_directory
path_rename
path_symlink
path_unlink_file
poll_oneoff
proc_exit
random_get
sched_yield
sock_recv
sock_send
sock_shutdown
thread-spawn
(スレッド提案より) デバッグ リリースをビルドするには、 BUILD=debug
make
に渡します。
サニタイザーを有効にするには、 make
に渡されるSANITIZERS
変数にサニタイザーをリストします (例: make BUILD=debug SANITIZERS="base clang address thread"
。
base
未定義動作サニタイザーを有効にしますclang
Clang 固有のサニタイザーを有効にしますthread
スレッドサニタイザーを有効にしますaddress
アドレスサニタイザーを有効にします Linux では、 libdwarf-dev
のような名前のパッケージをインストールしてみてください。
macOS では、Homebrew を使用してlibdwarf
( dwarf
はありません!) をインストールできます。
w2c2 は現在、デフォルトで v0.4.2 以上の libdwarf API を使用します。 v0.6.0 も正常に動作することがテストされています。
バージョン <0.4.2 を使用している場合は、 -DDWARF_OLD=1
CMake に渡してみてください。バージョン 20200114 は動作することが確認されています。
バージョン 0.1.1 以降、libdwarf には pkg-config ファイルが付属しており、CMake はこのファイルを自動的に検出できるはずです。
CMake によって libdwarf が自動的に見つからない場合は、次のメッセージが表示されます。
-- Checking for module 'libdwarf'
-- No package 'libdwarf' found
その場合でも、次のオプションのバリエーションを渡すことで、必要な情報を手動で提供できます。
-DDWARF_FOUND=1 -DDWARF_LIBRARIES=-ldwarf -DDWARF_LIBRARY_DIRS=/usr/lib -DDWARF_INCLUDE_DIRS=/usr/include/libdwarf