Отладка WASM с помощью Firefox: импортированная таблица с несовместимым размером - PullRequest
0 голосов
/ 24 сентября 2018

Я пытаюсь научиться веб-сборке.Я могу скомпилировать wasm из C-кода.Тем не менее, я испытываю большие трудности, пытаясь заставить мой код работать в 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 голосов
/ 24 сентября 2018

Я идиот.Измените 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));
...