【问题标题】:LLVM IR -> WebAssembly. Wasm empty module | instanceLLVM IR -> WebAssembly。 Wasm 空模块 |实例
【发布时间】:2020-03-15 17:16:42
【问题描述】:

我正在尝试生成 WebBrowser (Firefox) 可以正确理解的有效 wasm 文件,但我不确定我在这里做错了

这是Main.ll 文件

define i32 @main() {
  ret i32 42
}

然后我使用的是 llc (Linux):

./llc -mtriple=wasm32-unknown-unknown -O3 -filetype=obj main.ll -o main.o

然后我使用 wasm-ld (Linux):

./wasm-ld main.o -o main.wasm --no-entry -allow-undefined

然后我将main.wasm复制到Windows,然后打开这个本地文件页面:

|-- fille.html
|-- main.wasm

<div id="test">
</div>

<style>
    #test
    {
        border: 3px solid red;
        width: 100%;
        height: 100%;
    }
</style>

<script>
    fetch("main.wasm")
        .then(response => response.arrayBuffer())
        .then(bytes => WebAssembly.instantiate(bytes, {}))
        .then(results => {
          window.alert(results.instance.exports.main());
        });
</script>

但是

TypeError: results.instance.exports.main 不是函数

怎么了?

结果如下:

console.log(JSON.stringify(results));

{"module":{},"instance":{}}

版本:

./llc --version

LLVM (http://llvm.org/):
LLVM version 10.0.0

./wasm-ld --version

LLD 10.0.0

【问题讨论】:

    标签: llvm webassembly


    【解决方案1】:

    原因是你在链接过程中没有导出任何符号。

    您可能想查看the Exports section of wasm-ld docs 了解详细信息,但这里是他们对默认值的看法:

    在构建可执行文件时,默认情况下仅导出入口点 (_start) 和带有 WASM_SYMBOL_EXPORTED 标志的符号。

    你有几个选择:

    1. main 重命名为 _start - 这将确保导出 _start 并且从环境中正确导入其任何依赖项,而不是像现在发生的那样完全从 GCd 导入。
    2. 使用--export-all 标志调用wasm-ld - 这将导出目标文件中的所有符号。通常不建议使用此选项,因为您可能会阻止有用的尺寸优化并暴露您不想暴露的东西,但可能适合原型设计。
    3. --export-dynamic 调用wasm-ld - 这将导出在IR 级别标记为可见的所有符号。
    4. 在调用 wasm-ld 时显式列出符号,例如--export=main.

    在除 (1) 之外的所有选项中需要注意的另一个警告是,main 以特殊方式处理,并且使用您当前的代码,它将导致两个不同的符号:

    1. main - 一个自动生成的函数包装器,其中有两个参数用于调用您的函数的 argcargv
    2. __original_main - 您实际定义的函数的符号。

    为确保您不会遇到这种情况,请按照选项 1 并将 main 重命名为 _start,这是一个特定于 Wasm 的入口点并且不接受任何参数,或者更改您的 @987654341 的签名@ 函数到正确的一个并接受 argcargv 就像在 C 中一样。

    希望这一切都能助您一臂之力。

    【讨论】:

    • @Axelly 很高兴它有帮助:)
    猜你喜欢
    • 2019-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多