craigmc08 craigmc08 -4 years ago 311
Javascript Question

WebAssembly LinkError: function import requires a callable

I've recently started working with WebAssembly. I hit a problem trying to use log in my C code. I recreated the error in the simplest way I could. The error I get is

Uncaught (in promise) LinkError: WebAssembly.Instance(): Import #1 module="env" function="_log" error: function import requires a callable


The error points to this function, specifically
WebAsembly.Instance(module, imports)


function loadWebAssembly(filename, imports = {}) {
return fetch(filename)
.then((response) => response.arrayBuffer())
.then((buffer) => WebAssembly.compile(buffer))
.then((module) => {
imports.env = imports.env || {}
Object.assign(imports.env, {
memoryBase: 0,
tableBase: 0,
memory: new WebAssembly.Memory({
initial: 256,
maximum: 512,
}),
table: new WebAssembly.Table({
initial: 0,
maximum: 0,
element: 'anyfunc',
}),
})
return new WebAssembly.Instance(module, imports)
})
}


(I call this function with
loadWebAssembly('/test.wasm')
)

My C code is

#include <math.h>

double test(v) {
return log(v)
}


and gets no errors when compiled with

emcc test.c -Os -s WASM=1 -s SIDE_MODULE=1 -o test.wasm


I haven't been able to fix this error, I hope someone can help me out.

Answer Source

You aren't providing an implementation of log() in imports.env

Object.assign(imports.env, {
    memoryBase: 0,
    tableBase: 0,
    memory: new WebAssembly.Memory({
        initial: 256,
        maximum: 512,
    }),
    table: new WebAssembly.Table({
        initial: 0,
        maximum: 0,
        element: 'anyfunc',
    }),
    _log: Math.log,
})
Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download