Stream: wamr

Topic: What command do you use to generate the the AOT file?


view this post on Zulip Rusty (Dec 14 2023 at 05:05):

I'm using WAMR-1.2.3 (the latest release as of now). When I run the sample code (wasm-micro-runtime-WAMR-1.2.3/product-mini/platforms/esp-idf), everything works fine. When I try exporting the wasm binary and run wasm2wat, I get:

(module
  (type (;0;) (func (param i32) (result i32)))
  (type (;1;) (func (param i32 i32) (result i32)))
  (type (;2;) (func (param i32)))
  (import "env" "puts" (func (;0;) (type 0)))
  (import "env" "malloc" (func (;1;) (type 0)))
  (import "env" "printf" (func (;2;) (type 1)))
  (import "env" "free" (func (;3;) (type 2)))
  (func (;4;) (type 1) (param i32 i32) (result i32)
    (local i32 i32 i32)
    global.get 0
    i32.const 32
    i32.sub
    local.tee 2
    global.set 0
    i32.const 1051
    call 0
    drop
    block  ;; label = @1
      block  ;; label = @2
        i32.const 1024
        call 1
        local.tee 3
        br_if 0 (;@2;)
        i32.const 1064
        call 0
        drop
        i32.const -1
        local.set 4
        br 1 (;@1;)
      end
      local.get 2
      local.get 3
      i32.store offset=16
      i32.const 1024
      local.get 2
      i32.const 16
      i32.add
      call 2
      drop
      i32.const 0
      local.set 4
      local.get 3
      i32.const 4
      i32.add
      i32.const 0
      i32.load16_u offset=1041 align=1
      i32.store16 align=1
      local.get 3
      i32.const 0
      i32.load offset=1037 align=1
      i32.store align=1
      local.get 2
      local.get 3
      i32.store
      i32.const 1043
      local.get 2
      call 2
      drop
      local.get 3
      call 3
    end
    local.get 2
    i32.const 32
    i32.add
    global.set 0
    local.get 4)
  (table (;0;) 1 1 funcref)
  (memory (;0;) 1)
  (global (;0;) (mut i32) (i32.const 5184))
  (global (;1;) i32 (i32.const 1082))
  (global (;2;) i32 (i32.const 5184))
  (export "memory" (memory 0))
  (export "__data_end" (global 1))
  (export "__heap_base" (global 2))
  (export "main" (func 4))
  (data (;0;) (i32.const 1024) "buf ptr: %p\0a\001234\0a\00buf: %s\00Hello world!\00malloc buf failed\00"))

I then run wamrc like this: wamrc "-o" "sample.aot" --target=riscv32 --target-abi=ilp32 sample.wasm --cpu-features=+i,+m,+c --bounds-checks=1

Then I transform the output (sample.aot) to a header file (xxd -i sample.aot >> test_wasm.h) and use that.

After the program prints "Unload WASM module", it crashes complaining that assert failed: heap_caps_free heap_caps.c:392 (heap != NULL && "free() target pointer is outside heap areas").

Doing a bit of logging, the program tries freeing a pointer to "0xc".

freeing
real freeing 0x40394780
freeing
real freeing 0xc

assert failed: heap_caps_free heap_caps.c:392 (heap != NULL && "free() target pointer is outside heap areas")
Core  0 register dump:
MEPC    : 0x403806f8  RA      : 0x40383a64  SP      : 0x3fc94180  GP      : 0x3fc8c400
TP      : 0x3fc89848  T0      : 0x37363534  T1      : 0x7271706f  T2      : 0x33323130
S0/FP   : 0x0000005a  S1      : 0x00000001  A0      : 0x3fc941bc  A1      : 0x3fc8db99
A2      : 0x00000001  A3      : 0x00000029  A4      : 0x00000001  A5      : 0x3fc8f000
A6      : 0x7a797877  A7      : 0x76757473  S2      : 0x00000009  S3      : 0x3fc942fd
S4      : 0x3fc8db98  S5      : 0x00000000  S6      : 0x00000000  S7      : 0x00000000
S8      : 0x00000000  S9      : 0x00000000  S10     : 0x00000000  S11     : 0x00000000
T3      : 0x6e6d6c6b  T4      : 0x6a696867  T5      : 0x66656463  T6      : 0x62613938
MSTATUS : 0x00001881  MTVEC   : 0x40380001  MCAUSE  : 0x00000007  MTVAL   : 0x00000000
MHARTID : 0x00000000

I suspect that there's some kind of memory corruption. Can this be because I'm passing the wrong flags to wamrc, and what flags were passed to build the original source?

view this post on Zulip Rusty (Dec 14 2023 at 05:32):

I tried not calling any functions (just go through the setup/tear-down procedure. It doesn't help.

view this post on Zulip Wenyong Huang (Dec 14 2023 at 07:19):

Hi, the AOT file buffer should be at 4-byte aligned address, could you please try adding __aligned(4) for the array generated by xxd tool? And could you dump more log if it doesn't work? e.g., add "-v=5" for iwasm or add some os_printf in wasm_runtime_full_init?

view this post on Zulip Rusty (Dec 14 2023 at 23:51):

Wenyong Huang said:

Hi, the AOT file buffer should be at 4-byte aligned address, could you please try adding __aligned(4) for the array generated by xxd tool? And could you dump more log if it doesn't work? e.g., add "-v=5" for iwasm or add some os_printf in wasm_runtime_full_init?

__aligned(4) doesn't help. Where should I add printf to wasm_runtime_full_init?

view this post on Zulip Rusty (Dec 14 2023 at 23:53):

Also, is there a doxygen documentation somewhere online?

view this post on Zulip Wenyong Huang (Dec 19 2023 at 02:19):

__aligned(4) doesn't help. Where should I add printf to wasm_runtime_full_init?

I meant to add printf sentences in:
https://github.com/bytecodealliance/wasm-micro-runtime/blob/main/core/iwasm/common/wasm_runtime_common.c#L649-L702

Also, is there a doxygen documentation somewhere online?

No doxygen document, but you can refer to:
https://wamr.gitbook.io/document/
https://bytecodealliance.github.io/wamr.dev/
https://github.com/bytecodealliance/wasm-micro-runtime/tree/main/doc

WebAssembly Micro Runtime (WAMR) is a lightweight standalone WebAssembly (WASM) runtime with small footprint, high performance and highly configurable features for applications cross from embedded, IoT, edge to Trusted Execution Environment (TEE), smart contract, cloud native and so on.

Last updated: Dec 23 2024 at 12:05 UTC