Traduce módulos WebAssembly a C portátil. Inspirado en wasm2c de wabt.
Trabajando hacia WebAssembly como el binario universal esquivo:
↗ different
source code → WebAssembly → C89 → OSes,
(C++, Rust, ...) ↘ CPUs
names
.debug_line
. Requiere la instalación de libdwarf. Vea las instrucciones a continuación.Si su sistema es compatible con al menos CMake 2.8.12, prefiera usar CMake para detectar funciones. En sistemas sin CMake también puedes usar Make.
cd w2c2
cmake -B build
cmake --build build
cd wasi
cmake -B build
cmake --build build
Por ejemplo, para compilar module.wasm
en module.c
(y module.h
):
./w2c2 module.wasm module.c
w2c2 puede compilar un módulo en archivos C separados. Esto se recomienda al compilar módulos grandes y en hosts con recursos limitados.
Por ejemplo, para compilar module.wasm
(y module.h
), en varios archivos con 100 funciones cada uno:
./w2c2 -f 100 module.wasm module.c
Cuando w2c2 se creó con soporte de subprocesos, puede compilar un módulo en paralelo. De forma predeterminada, w2c2 genera tantos subprocesos de trabajo como núcleos de CPU estén disponibles.
Para especificar manualmente el número de subprocesos de trabajo, pase el número utilizando el indicador -t
.
Por ejemplo, para compilar usando 2 subprocesos:
./w2c2 -t 2 module.wasm module.c
Marca principal:
cd examples/coremark
make
./coremark
Requiere Python 3 y wabt (para 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
(de la propuesta de hilos) Para crear una versión de depuración, pase BUILD=debug
para make
.
Para habilitar los desinfectantes, enumerelos en la variable SANITIZERS
pasada a make
, por ejemplo, make BUILD=debug SANITIZERS="base clang address thread"
.
base
habilita el desinfectante de comportamiento indefinido.clang
habilita desinfectantes específicos de Clangthread
habilita el desinfectante de hiloaddress
habilita el desinfectante de direcciones. En Linux, intente instalar un paquete llamado libdwarf-dev
En macOS, puedes usar Homebrew e instalar libdwarf
(¡no dwarf
!)
Actualmente, w2c2 utiliza de forma predeterminada la API libdwarf de >=v0.4.2. También se ha probado que v0.6.0 funciona correctamente.
Si usa una versión <0.4.2, intente pasar -DDWARF_OLD=1
a CMake. Se sabe que la versión 20200114 funciona.
Desde la versión 0.1.1, libdwarf viene con un archivo pkg-config, que CMake debería poder detectar automáticamente.
Si CMake no puede encontrar libdwarf automáticamente, recibirá el siguiente mensaje:
-- Checking for module 'libdwarf'
-- No package 'libdwarf' found
En ese caso, aún puedes proporcionar la información necesaria manualmente pasando una variación de las siguientes opciones:
-DDWARF_FOUND=1 -DDWARF_LIBRARIES=-ldwarf -DDWARF_LIBRARY_DIRS=/usr/lib -DDWARF_INCLUDE_DIRS=/usr/include/libdwarf