LLVM IR->;网络组装。Wasm空模块|实例
我试图生成WebBrowser(Firefox)能够正确理解的有效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
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
明确列出符号main
以特殊方式处理,对于当前代码,它将导致两个不同的符号:
main
-一个自动生成的函数包装器,包含两个参数,分别用于调用函数的argc
和argv
\uuu original\u main
-实际定义的函数的符号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
明确列出符号main
以特殊方式处理,对于当前代码,它将导致两个不同的符号:
main
-一个自动生成的函数包装器,包含两个参数,分别用于调用函数的argc
和argv
\uuu original\u main
-实际定义的函数的符号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