将数据传递给WebAssembly

问题描述 投票:0回答:2

我正在尝试将值从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。有任何想法吗?

webassembly
2个回答
1
投票

你用什么来编译你的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成为一个可以通过importObj传递的进口全球。我希望这仍然有助于走上正确的道路。


1
投票

当前的lld实现在链接时不支持未定义的数据符号。如果您通过--allow-undefined,您将得到未定义的符号,其地址为0。

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

© www.soinside.com 2019 - 2024. All rights reserved.