将数据传递给 WebAssembly

Passing data to WebAssembly

我正在尝试将一个值从 JavaScript 传递给 WASM,但它不起作用。这是我的 C 代码:

extern int x;
int foo() {
  return x;
}

在JavaScript中,我实例化模块并将x设置为5:

var importObj = {
  env: { 
    memory: new WebAssembly.Memory({initial: 256, maximum: 256}),     
    _x: 5
  }
};    

WebAssembly.instantiateStreaming(fetch('test.wasm'), importObj)
.then(result =>
    console.log('Output: ' + result.instance.exports._foo())
);

这不会产生任何错误,但记录的消息是 Output: 0 而不是 Output: 5。有什么想法吗?

你用什么把你的C代码编译成wasm?我试图让它在 https://webassembly.studio 上运行,发现函数 foo 从内存位置 0 加载值。所以我能够通过从 JS 初始化实例内存来生成 Output: 5

WebAssembly.instantiateStreaming(fetch('test.wasm'), importObj)
  .then(result => {
    const mem = new Uint32Array(result.instance.exports.memory.buffer)
    mem[0] = 5
    console.log('Output: ' + result.instance.exports._foo())
  });

老实说,我希望 extern int x 成为 wasm 中的一个导入全局变量,可以通过 importObj 传递。我希望这仍然有助于走上正确的道路。

当前的 lld 实现在 link 时不支持未定义的数据符号。如果你传递 --allow-undefined 你将得到地址为 0 的未定义符号。

我们一直在讨论添加对导入数据符号的支持:https://github.com/WebAssembly/tool-conventions/issues/48