如何使用脚本生成独立的webassembly

问题描述 投票:1回答:1

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是否可能获得类似的输出?

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

javascript emscripten webassembly
1个回答
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.wasm您将获得以下WebAssembly文本:

wasm2wat

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

© www.soinside.com 2019 - 2024. All rights reserved.