为什么WASM文件不同



我想使用WebAssembly,所以我必须将C文件编译为WASM文件。

C文件的内容如下

//The online 'add.c'
WASM_EXPORT
int add(int a, int b)
{ 
return a + b;
}

这是一个非常简单的C文件。

这个WASM文件是由在线编译工具WebAssemblyStudio编译的。我用一个工具";wasm2wat";将其反汇编为Text文件,其内容如下

(module
(type $t0 (func))
(type $t1 (func (param i32 i32) (result i32)))
(func $__wasm_call_ctors (type $t0))
(func $add (type $t1) (param $p0 i32) (param $p1 i32) (result i32)
local.get $p1
local.get $p0
i32.add)
(table $T0 1 1 funcref)
(memory $memory 2)
(global $g0 (mut i32) (i32.const 66560))
(global $__heap_base i32 (i32.const 66560))
(global $__data_end i32 (i32.const 1024))
(export "memory" (memory 0))
(export "__heap_base" (global 1))
(export "__data_end" (global 2))
(export "add" (func $add)))

并且我还使用";emcc add.c-s WASM=1-O3-o add.js";以编译本地";加上"c";

//The local 'add.c'
EMSCRIPTEN_KEEPALIVE
int add(int a, int b)
{
return a + b;
}

从上面的命令获得的WASM文件是

(module
(type $t0 (func))
(type $t1 (func (param i32 i32) (result i32)))
(func $b (type $t0)
nop)
(func $c (type $t1) (param $p0 i32) (param $p1 i32) (result i32)
local.get $p0
local.get $p1
i32.add)
(table $a 1 1 funcref)
(export "a" (table 0))
(export "b" (func $b))
(export "c" (func $c)))

为什么这两个结果不同为什么上面的文件可以在HTML中使用,而不能在下面的文件中使用

这是两个略有不同的编译器驱动程序(尽管两者都基于llvm+clang(,它们针对的环境略有不同。ABI/neneneba API/与嵌入程序的合同在几个方面有所不同。例如,在emscripten中,默认约定是在JS中创建WebAssembly内存对象,并将其导出到WebAssembly文件中。WASI(web之外的wasm(的默认设置是在wasm文件中创建内存对象并将其导出到嵌入程序(因此在第一种情况下为"内存"导出(。

第一个例子中的一些多余元素可能会通过对结果输出运行wasm-opt来消除。例如,如果你的小例子既没有使用内存也没有使用表,那么理论上这两个都可以完全删除。

相关内容

  • 没有找到相关文章

最新更新