將 WebAssembly 模組轉換為可移植的 C。
致力於將 WebAssembly 打造為難以捉摸的通用二進位檔案:
↗ different
source code → WebAssembly → C89 → OSes,
(C++, Rust, ...) ↘ CPUs
names
自訂部分中提供了函數名稱.debug_line
自訂部分中提供了 DWARF 行資訊。需要安裝 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
啟用 Thread Sanitizeraddress
啟用地址消毒器在 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