
將 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.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