使用Firefox调试WASM:大小不兼容的导入表

时间:2018-09-24 02:32:34

标签: firefox webassembly

我正在尝试学习网络汇编。我能够从C代码编译wasm。但是,在让我的代码在Firefox中运行时,我遇到了很多困难。我的代码很基本:

hello.html

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
</head>
<body>
</body>
<script async type="text/javascript" src="hello.js"></script>
</html>

hello.js

"use strict";

const imports = {
    env: {
        "abort": function() {},
        "memoryBase": 0,
        "tableBase": 0,
        "memory": new WebAssembly.Memory({ initial: 4 }),
        "table": new WebAssembly.Table({ initial: 0, element: 'anyfunc' }),
    }
}

WebAssembly.instantiateStreaming(fetch('hello.wasm'), imports)
.then(obj => console.log(obj.instance.exports._add(1, 2)))
.catch(error => console.log(error));

hello.c

#include <emscripten.h>

EMSCRIPTEN_KEEPALIVE int add(x, y) { return x + y; }

我这样编译我的代码:

emcc hello.c -O1 -g4 -s WASM=1 -s SIDE_MODULE=1 -o hello.wasm --source-map-base http://localhost:8080/ --emrun

并且我使用emrun服务我的文件

emrun --no_browser --port 8080 .

问题

最初,Firefox抱怨LinkError: "import object field 'abort' is not a Function".会检查编译期间生成的hello.wast,看起来确实需要中止功能(我猜想abort()是C运行时的预期部分)。因此,我在"abort": function() {},的env部分中添加了imports行。

但是现在我得到LinkError: "imported Table with incompatible size".的消息让我很困惑。我如何才能运行wasm代码?

我正在尝试使用Firefox Developer Edition 63.0b8(64位)进行调试。 emcc是1.38.11。

1 个答案:

答案 0 :(得分:2)

我是个白痴。将此处的0更改为任何其他数字。例如:

"table": new WebAssembly.Table({ initial: 0, element: 'anyfunc' }),
                                          |
                                          v
"table": new WebAssembly.Table({ initial: 2, element: 'anyfunc' }),

此hello.js文件应该可以工作。

"use strict";

const imports = {
    env: {
        "abort": function() {},
        "memoryBase": 0,
        "tableBase": 0,
        "memory": new WebAssembly.Memory({ initial: 4 }),
        "table": new WebAssembly.Table({ initial: 4, element: 'anyfunc' }),
    }
}

WebAssembly.instantiateStreaming(fetch('hello.wasm'), imports)
.then(obj => console.log(obj.instance.exports._add(1, 2)))
.catch(error => console.log(error));