Enable AoT and wamr-sdk, and change arguments of call wasm API (#157)
* Implement memory profiler, optimize memory usage, modify code indent * Implement memory.grow and limit heap space base offset to 1G; modify iwasm build type to Release and 64 bit by default * Add a new extension library: connection * Fix bug of reading magic number and version in big endian platform * Re-org platform APIs: move most platform APIs from iwasm to shared-lib * Enhance wasm loader to fix some security issues * Fix issue about illegal load of EXC_RETURN into PC on stm32 board * Updates that let a restricted version of the interpreter run in SGX * Enable native/app address validation and conversion for wasm app * Remove wasm_application_exectue_* APIs from wasm_export.h which makes confused * Refine binary size and fix several minor issues Optimize interpreter LOAD/STORE opcodes to decrease the binary size Fix issues when using iwasm library: _bh_log undefined, bh_memory.h not found Remove unused _stdin/_stdout/_stderr global variables resolve in libc wrapper Add macros of global heap size, stack size, heap size for Zephyr main.c Clear compile warning of wasm_application.c * Add more strict security checks for libc wrapper API's * Use one libc wrapper copy for sgx and other platforms; remove bh_printf macro for other platform header files * Enhance security of libc strcpy/sprintf wrapper function * Fix issue of call native for x86_64/arm/mips, add module inst parameter for native wrapper functions * Remove get_module_inst() and fix issue of call native * Refine wgl lib: remove module_inst parameter from widget functions; move function index check to runtime instantiate * Refine interpreter call native process, refine memory boudary check * Fix issues of invokeNative function of arm/mips/general version * Add a switch to build simple sample without gui support * Add BUILD_TARGET setting in makefile to replace cpu compiler flags in source code * Re-org shared lib header files, remove unused info; fix compile issues of vxworks * Add build target general * Remove unused files * Update license header * test push * Restore file * Sync up with internal/feature * Sync up with internal/feature * Rename build_wamr_app to build_wasm_app * Fix small issues of README * Enhance malformed wasm file checking Fix issue of print hex int and implement utf8 string check Fix wasi file read/write right issue Fix minor issue of build wasm app doc * Sync up with internal/feature * Sync up with internal/feature: fix interpreter arm issue, fix read leb issue * Sync up with internal/feature * Fix bug of config.h and rename wasi config.h to ssp_config.h * Sync up with internal/feature * Import wamr aot * update document * update document * Update document, disable WASI in 32bit * update document * remove files * update document * Update document * update document * update document * update samples * Sync up with internal repo
This commit is contained in:
@ -1,10 +1,18 @@
|
||||
|
||||
|
||||
Build WASM app
|
||||
# Prepare WASM building environments
|
||||
|
||||
WASI-SDK version 7.0+ is the major tool supported by WAMR for building WASM applications. There are some other WASM compilers such as the standard clang compiler and Emscripten might also work [here](./other_wasm_compilers.md).
|
||||
|
||||
Install WASI SDK: Download the [wasi-sdk](https://github.com/CraneStation/wasi-sdk/releases) and extract the archive to default path `/opt/wasi-sdk`
|
||||
|
||||
|
||||
Build WASM applications
|
||||
=========================
|
||||
|
||||
You can write a simple ```test.c``` as the first sample.
|
||||
|
||||
```C
|
||||
``` C
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
@ -30,146 +38,89 @@ int main(int argc, char **argv)
|
||||
}
|
||||
```
|
||||
|
||||
There are several methods to build a WASM binary. They are the clang compiler, Docker, Emscripten and so on.
|
||||
|
||||
## Use clang compiler
|
||||
|
||||
The recommended method to build a WASM binary is to use clang compiler ```clang-8```. You can refer to [apt.llvm.org](https://apt.llvm.org) for the detailed instructions. Here are referenced steps to install clang-8 in Ubuntu 16.04 and Ubuntu 18.04.
|
||||
To build the source file to WASM bytecode, input following command:
|
||||
|
||||
(1) Add source to your system source list from llvm website
|
||||
|
||||
For Ubuntu 16.04, add the following lines to /etc/apt/sources.list:
|
||||
|
||||
```Bash
|
||||
deb http://apt.llvm.org/xenial/ llvm-toolchain-xenial main
|
||||
deb-src http://apt.llvm.org/xenial/ llvm-toolchain-xenial main
|
||||
# 8
|
||||
deb http://apt.llvm.org/xenial/ llvm-toolchain-xenial-8 main
|
||||
deb-src http://apt.llvm.org/xenial/ llvm-toolchain-xenial-8 main
|
||||
# 9
|
||||
deb http://apt.llvm.org/xenial/ llvm-toolchain-xenial-9 main
|
||||
deb-src http://apt.llvm.org/xenial/ llvm-toolchain-xenial-9 main
|
||||
``` Bash
|
||||
/opt/wasi-sdk/bin/clang test.c -o test.wasm
|
||||
```
|
||||
|
||||
For Ubuntu 18.04, add the following lines to /etc/apt/sources.list:
|
||||
|
||||
```Bash
|
||||
# i386 not available
|
||||
deb http://apt.llvm.org/bionic/ llvm-toolchain-bionic main
|
||||
deb-src http://apt.llvm.org/bionic/ llvm-toolchain-bionic main
|
||||
# 8
|
||||
deb http://apt.llvm.org/bionic/ llvm-toolchain-bionic-8 main
|
||||
deb-src http://apt.llvm.org/bionic/ llvm-toolchain-bionic-8 main
|
||||
# 9
|
||||
deb http://apt.llvm.org/bionic/ llvm-toolchain-bionic-9 main
|
||||
deb-src http://apt.llvm.org/bionic/ llvm-toolchain-bionic-9 main
|
||||
```
|
||||
# Build a project with cmake
|
||||
|
||||
(2) Download and install clang-8 tool-chain using following commands:
|
||||
If you have complex WASM application project which contains dozens of source files, you can consider using cmake for project building.
|
||||
|
||||
```Bash
|
||||
sudo wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key|sudo apt-key add -
|
||||
# Fingerprint: 6084 F3CF 814B 57C1 CF12 EFD5 15CF 4D18 AF4F 7421
|
||||
sudo apt-get update
|
||||
sudo apt-get install llvm-8 lld-8 clang-8
|
||||
```
|
||||
|
||||
(3) Create a soft link under /usr/bin:
|
||||
|
||||
```Bash
|
||||
cd /usr/bin
|
||||
sudo ln -s wasm-ld-8 wasm-ld
|
||||
```
|
||||
|
||||
(4) Use the clang-8 command below to build the WASM C source code into the WASM binary.
|
||||
|
||||
```Bash
|
||||
clang-8 --target=wasm32 -O3 \
|
||||
-z stack-size=4096 -Wl,--initial-memory=65536 \
|
||||
-Wl,--allow-undefined,--export=main \
|
||||
-Wl,--strip-all,--no-entry -nostdlib \
|
||||
-o test.wasm test.c
|
||||
```
|
||||
|
||||
You will get ```test.wasm``` which is the WASM app binary.
|
||||
|
||||
## Use cmake
|
||||
|
||||
If you have a cmake project, you can cross compile your project by using the toolchain provided by WAMR, the compiler used by WAMR toolchain is `clang-8`.
|
||||
You can cross compile your project by using the toolchain provided by WAMR.
|
||||
|
||||
We can generate a `CMakeLists.txt` file for `test.c`:
|
||||
```cmake
|
||||
|
||||
``` cmake
|
||||
cmake_minimum_required (VERSION 3.5)
|
||||
project(hello_world)
|
||||
|
||||
set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS},--export=main")
|
||||
add_executable(hello_world test.c)
|
||||
```
|
||||
It is quite simple to build this project by cmake:
|
||||
```Bash
|
||||
|
||||
It is simple to build this project by cmake:
|
||||
|
||||
``` Bash
|
||||
mkdir build && cd build
|
||||
cmake .. -DCMAKE_TOOLCHAIN_FILE=$WAMR_ROOT/test-tools/toolchain/wamr_toolchain.cmake
|
||||
cmake .. -DCMAKE_TOOLCHAIN_FILE=$WAMR_ROOT/wamr-sdk/app/wamr_toolchain.cmake
|
||||
make
|
||||
```
|
||||
|
||||
You will get ```hello_world``` which is the WASM app binary.
|
||||
|
||||
For more details about wamr toolchain, please refer to [test-tools/toolchain](../test-tools/toolchain/README.md).
|
||||
> Note: If you have already built a SDK profile, then the **DCMAKE_TOOLCHAIN_FILE** should be changed into `$WAMR_ROOT/wamr-sdk/out/${PROFILE}/app-sdk/wamr_toolchain.cmake`
|
||||
|
||||
## Use wasi-sdk
|
||||
|
||||
To build a wasm application with wasi support, wasi-sdk is required. Download the [wasi-sdk](https://github.com/CraneStation/wasi-sdk/releases) and extract the archive, then you can use it to build your application:
|
||||
```Bash
|
||||
/path/to/wasi-sdk/bin/clang test.c -o test.wasm
|
||||
```
|
||||
# Compile WASM to AoT module
|
||||
|
||||
You will get ```test.wasm``` which is the WASM app binary.
|
||||
Please ensure the wamrc was already generated and available in your shell PATH. Then we can use wamrc to compile WASM app binary to WAMR AoT binary.
|
||||
|
||||
## Using Docker
|
||||
|
||||
Another method availble is using [Docker](https://www.docker.com/). We assume you've already configured Docker (see Platform section above) and have a running interactive shell. Currently the Dockerfile only supports compiling apps with clang, with Emscripten planned for the future.
|
||||
|
||||
Use the clang-8 command below to build the WASM C source code into the WASM binary.
|
||||
|
||||
```Bash
|
||||
clang-8 --target=wasm32 -O3 \
|
||||
-z stack-size=4096 -Wl,--initial-memory=65536 \
|
||||
-Wl,--allow-undefined,--export=main \
|
||||
-Wl,--strip-all,--no-entry -nostdlib \
|
||||
-o test.wasm test.c
|
||||
```
|
||||
|
||||
You will get ```test.wasm``` which is the WASM app binary.
|
||||
|
||||
## Use Emscripten tool
|
||||
|
||||
The last method to build a WASM binary is to use Emscripten tool ```emcc```.
|
||||
Assuming you are using Linux, you may install emcc from Emscripten EMSDK following the steps below:
|
||||
|
||||
```
|
||||
git clone https://github.com/emscripten-core/emsdk.git
|
||||
cd emsdk
|
||||
./emsdk install latest-fastcomp
|
||||
./emsdk activate latest-fastcomp
|
||||
```
|
||||
The Emscripten website provides other installation methods beyond Linux.
|
||||
|
||||
Use the emcc command below to build the WASM C source code into the WASM binary.
|
||||
``` Bash
|
||||
cd emsdk
|
||||
source emsdk_env.sh (or add it to ~/.bashrc if you don't want to run it each time)
|
||||
cd <dir of test.c>
|
||||
EMCC_ONLY_FORCED_STDLIBS=1 emcc -g -O3 -s WASM=1 -s ERROR_ON_UNDEFINED_SYMBOLS=0 \
|
||||
-s TOTAL_MEMORY=65536 -s TOTAL_STACK=4096 \
|
||||
-s ASSERTIONS=1 -s STACK_OVERFLOW_CHECK=2 \
|
||||
-s "EXPORTED_FUNCTIONS=['_main']" -o test.wasm test.c
|
||||
wamrc -o test.aot test.wasm
|
||||
```
|
||||
You will get ```test.wasm``` which is the WASM app binary.
|
||||
|
||||
Run WASM app
|
||||
wamrc supports a number of compilation options through the command line arguments:
|
||||
|
||||
``` Bash
|
||||
wamrc --help
|
||||
Usage: wamrc [options] -o output_file wasm_file
|
||||
--target=<arch-name> Set the target arch, which has the general format: <arch><sub>
|
||||
<arch> = x86_64, i386, arm, thumb, mips.
|
||||
Default is host arch, e.g. x86_64
|
||||
<sub> = for ex. on arm or thumb: v5, v6m, v7a, v7m, etc.
|
||||
Use --target=help to list supported targets
|
||||
--cpu=<cpu> Set the target CPU (default: host CPU, e.g. skylake)
|
||||
Use --target=help to list all the CPU supported
|
||||
--cpu-features=<features> Enable or disable the CPU features
|
||||
Use +feature to enable a feature, or -feature to disable it
|
||||
For example, --cpu-features=+feature1,-feature2
|
||||
Use --cpu-features=+help to list all the features supported
|
||||
--opt-level=n Set the optimization level (0 to 3, default: 3)
|
||||
--format=<format> Specifies the format of the output file
|
||||
The format supported:
|
||||
aot (default) AoT file
|
||||
object Native object file
|
||||
llvmir-unopt Unoptimized LLVM IR
|
||||
llvmir-opt Optimized LLVM IR
|
||||
Examples: wamrc -o test.aot test.wasm
|
||||
wamrc --target=i386 -o test.aot test.wasm
|
||||
wamrc --target=i386 --format=object -o test.o test.wasm
|
||||
|
||||
```
|
||||
|
||||
|
||||
Run WASM app in WAMR mini product build
|
||||
========================
|
||||
|
||||
Assume you are using Linux, the command to run the test.wasm is:
|
||||
Run the test.wasm or test.aot with WAMR mini product build:
|
||||
``` Bash
|
||||
cd iwasm/products/linux/build
|
||||
./iwasm test.wasm
|
||||
./iwasm test.wasm or
|
||||
./iwasm test.aot
|
||||
```
|
||||
You will get the following output:
|
||||
```
|
||||
|
||||
Reference in New Issue
Block a user