如何使用emscripten生成独立的webassembly

时间:2018-08-28 09:10:11

标签: javascript emscripten webassembly

documentation提供了两个选项:让优化程序剥离不必要的代码,然后使用您自己的代码替换.js胶水,或使用SIDE_MODULE标志。

这两个选项都会导致memory的导入(而不是导出),并且在SIDE_MODULE的情况下,还会定义大量的导入/导出。

将其与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得到类似的输出?

更新:似乎静态/堆栈大小由emcc在内部确定,而检索它们的唯一方法是解析生成的.js文件。副模块是另一种野兽,如果我实际上不需要可重定位的模块,则应该避免使用它们。

1 个答案:

答案 0 :(得分:0)

您可以简单地将输出选项(-o)设置为扩展名为.wasm的文件名。然后Emscripten将仅输出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文件。另外,如果您使用以下命令拆卸test.wasmwasm2wat您将获得以下WebAssembly文本:

(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"))

如您所见,这正是您从最小的webassembly二进制文件中所期望的。