Search code examples
javascriptcwebassembly

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.


Solution

  • 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,
    })