代码之家  ›  专栏  ›  技术社区  ›  MatthewScarpino

将数据传递到WebAssembly

  •  0
  • MatthewScarpino  · 技术社区  · 6 年前

    我试图将一个值从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 . 有什么想法吗?

    2 回复  |  直到 6 年前
        1
  •  1
  •   Mauro Bringolf    6 年前

    你用什么把你的C代码编译成WASM?我试着让这个工作 https://webassembly.studio 发现了函数 foo 从内存位置加载值 0 . 所以我能生产 Output: 5 通过从JS初始化实例内存:

    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 . 我希望这仍然有助于走上正确的道路。

        2
  •  1
  •   sbc100    6 年前

    当前的LLD实现不支持链接时未定义的数据符号。如果你通过 --allow-undefined 您将以地址为0的未定义符号结束。

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