Переводит модули WebAssembly на портативный C. Вдохновлен Wasm2c от wabt.
Работа над 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 порождает столько рабочих потоков, сколько доступно ядер ЦП.
Чтобы вручную указать количество рабочих потоков, передайте число с помощью флага -t
.
Например, для компиляции с использованием двух потоков:
./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
.
Чтобы включить дезинфицирующие средства, перечислите их в переменной SANITIZERS
, переданной в make
, например make BUILD=debug SANITIZERS="base clang address thread"
.
base
включает дезинфицирующее средство неопределенного поведенияclang
включает специальные дезинфицирующие средства Clangthread
включает дезинфицирующее средство Thread Sanitizeraddress
включает адресное дезинфицирующее средство В Linux попробуйте установить пакет с именем libdwarf-dev
В macOS вы можете использовать Homebrew и установить libdwarf
(не dwarf
!)
w2c2 в настоящее время по умолчанию использует API libdwarf >=v0.4.2. Версия 0.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