如何使用 emscripten 生成独立的 webassembly



文档提供了两个选项:让优化器去除不必要的代码,然后用您自己的代码替换.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获得类似的输出?

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

您可以简单地将输出选项(-o(设置为扩展名为.wasm的文件名。然后,Emscripten 将仅输出 wasm 文件。

因此,如果您有以下test.c文件:

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

然后你用 emscripten 编译它,就像这样:

emcc -O3 test.c -o test.wasm

您只会获得文件test.wasm,而不会获得额外的.js文件。此外,test.wasm如果您使用例如wasm2wat你会得到这个 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) "a06P"))

如您所见,这正是您对最小 WebAssembly 二进制文件的期望。

相关内容

  • 没有找到相关文章

最新更新