我正在尝试学习网络汇编。我能够从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。
答案 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));