
Переводит модули 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.cw2c2 может скомпилировать модуль в отдельные файлы 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-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 .
Чтобы включить дезинфицирующие средства, перечислите их в переменной 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