将 WebAssembly 模块转换为可移植的 C。受到 wabt 的 wasm2c 的启发。
致力于将 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