
将 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.cw2c2 能够将模块编译成单独的 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-testsargs_getargs_sizes_getclock_res_getclock_time_getenviron_getenviron_sizes_getfd_advisefd_allocatefd_closefd_datasyncfd_fdstat_getfd_fdstat_set_flagsfd_fdstat_set_rightsfd_filestat_getfd_filestat_set_sizefd_filestat_set_timesfd_preadfd_prestat_getfd_prestat_dir_namefd_pwritefd_readfd_readdirfd_renumberfd_seekfd_syncfd_tellfd_writepath_create_directorypath_filestat_getpath_filestat_set_timespath_linkpath_openpath_readlinkpath_remove_directorypath_renamepath_symlinkpath_unlink_filepoll_oneoffproc_exitrandom_getsched_yieldsock_recvsock_sendsock_shutdownthread-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