代码之家  ›  专栏  ›  技术社区  ›  riv

如何使用emscripten生成独立的webassembly

  •  1
  • riv  · 技术社区  · 8 年前

    这个 documentation SIDE_MODULE 旗帜。

    两个选项都会导致 memory 进口(而不是出口),如果是 侧模块 还定义了大量额外的进出口。

    将其与 Webassembly Studio :

    (module
      (type $t0 (func))
      (type $t1 (func (result i32)))
      (func $__wasm_call_ctors (type $t0))
      (func $main (export "main") (type $t1) (result i32)
        i32.const 42)
      (table $T0 1 1 anyfunc)
      (memory $memory (export "memory") 2)
      (global $g0 (mut i32) (i32.const 66560))
      (global $__heap_base (export "__heap_base") i32 (i32.const 66560))
      (global $__data_end (export "__data_end") i32 (i32.const 1024)))
    

    在这里,内存被导出,并且 __heap_base 提供了,使编写自己的分配器变得容易。Emscripten输出不导出任何此类值,因此我们不知道从何处开始内存分配。

    有可能得到类似的输出 emcc

    更新:

    0 回复  |  直到 8 年前
        1
  •  0
  •   Peter Salomonsen    6 年前

    您可以简单地设置输出选项( -o )使用 .wasm

    所以如果你有 test.c 文件:

    #include "emscripten.h"
    
    EMSCRIPTEN_KEEPALIVE
    int add(int a, int b) {
        return a + b;
    }
    

    emcc -O3 test.c -o test.wasm
    

    你只会得到文件 test.wasm 没有多余的 .js 测试wasm wasm2wat 您将得到以下Web程序集文本:

    (module
      (type (;0;) (func))
      (type (;1;) (func (param i32 i32) (result i32)))
      (func (;0;) (type 0)
        nop)
      (func (;1;) (type 1) (param i32 i32) (result i32)
        local.get 0
        local.get 1
        i32.add)
      (memory (;0;) 256 256)
      (export "memory" (memory 0))
      (export "add" (func 1))
      (export "_start" (func 0))
      (data (;0;) (i32.const 1536) "\a0\06P"))