LLVM IR->;网络组装。Wasm空模块|实例

LLVM IR->;网络组装。Wasm空模块|实例,llvm,webassembly,Llvm,Webassembly,我试图生成WebBrowser(Firefox)能够正确理解的有效wasm文件,但我不确定我在这里是否做错了 这是Main.ll文件 define i32 @main() { ret i32 42 } 然后我使用llc(Linux): ./llc-mtriple=wasm32未知-O3-filetype=obj main.ll-o main.o 然后我使用wasm ld(Linux): ./wasm ld main.o-o main.wasm--无条目-允许未定义 然后我将main.was

我试图生成WebBrowser(Firefox)能够正确理解的有效wasm文件,但我不确定我在这里是否做错了

这是
Main.ll
文件

define i32 @main() {
  ret i32 42
}
然后我使用llc(Linux):

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

然后我使用wasm ld(Linux):

./wasm ld main.o-o main.wasm--无条目-允许未定义

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

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

版本:

/llc——版本

/wasm ld——版本


原因是您在链接期间没有导出任何符号

您可能想查看详细信息,但以下是他们对默认值的看法:

构建可执行文件时,默认情况下仅导出入口点(
\u start
)和带有
WASM\u SYMBOL\u EXPORTED
标志的符号

您有两种选择:

  • main
    重命名为
    \u start
    -这将确保导出
    \u start
    ,并从环境中正确导入其任何依赖项,而不是像现在这样完全导入GCd
  • 使用
    --export all
    标志调用
    wasm ld
    -这将导出对象文件中的所有符号。通常不建议使用此选项,因为您可能会阻止有用的大小优化,并公开您不想公开的内容,但对于原型设计来说可能是好的
  • 使用
    调用
    wasm ld
    ——导出动态
    ——这将导出在IR级别标记为可见的所有符号
  • 在调用
    wasm ld
    时,使用例如
    --export=main
    明确列出符号
  • 除(1)之外的所有选项中还有一个需要注意的注意事项是,
    main
    以特殊方式处理,对于当前代码,它将导致两个不同的符号:

  • main
    -一个自动生成的函数包装器,包含两个参数,分别用于调用函数的
    argc
    argv
  • \uuu original\u main
    -实际定义的函数的符号
  • 为了确保您不会遇到这种情况,请按照选项1将
    main
    重命名为
    \u start
    ,这是Wasm特定的入口点,不接受任何参数,或者将
    main
    函数的签名更改为正确的签名,并同时接受
    argc
    argv
    ,就像在C中一样


    希望这一切都能让您继续。

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

    您可能想查看详细信息,但以下是他们对默认值的看法:

    构建可执行文件时,默认情况下仅导出入口点(
    \u start
    )和带有
    WASM\u SYMBOL\u EXPORTED
    标志的符号

    您有两种选择:

  • main
    重命名为
    \u start
    -这将确保导出
    \u start
    ,并从环境中正确导入其任何依赖项,而不是像现在这样完全导入GCd
  • 使用
    --export all
    标志调用
    wasm ld
    -这将导出对象文件中的所有符号。通常不建议使用此选项,因为您可能会阻止有用的大小优化,并公开您不想公开的内容,但对于原型设计来说可能是好的
  • 使用
    调用
    wasm ld
    ——导出动态
    ——这将导出在IR级别标记为可见的所有符号
  • 在调用
    wasm ld
    时,使用例如
    --export=main
    明确列出符号
  • 除(1)之外的所有选项中还有一个需要注意的注意事项是,
    main
    以特殊方式处理,对于当前代码,它将导致两个不同的符号:

  • main
    -一个自动生成的函数包装器,包含两个参数,分别用于调用函数的
    argc
    argv
  • \uuu original\u main
    -实际定义的函数的符号
  • 为了确保您不会遇到这种情况,请按照选项1将
    main
    重命名为
    \u start
    ,这是Wasm特定的入口点,不接受任何参数,或者将
    main
    函数的签名更改为正确的签名,并同时接受
    argc
    argv
    ,就像在C中一样


    希望这一切都能让你走起来。

    @Axelly很高兴它有帮助:)@Axelly很高兴它有帮助:)
    <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>
    
    {"module":{},"instance":{}}
    
    LLVM (http://llvm.org/):
    LLVM version 10.0.0
    
    LLD 10.0.0