【发布时间】:2019-07-31 15:43:44
【问题描述】:
我正在尝试使用 wasm-ld(llvm wasm 链接器)链接两个简单的 wasm 文件
wasm 文件是使用 wabt 工具从 2 个简单的 wat 文件(mod_a.wat 和 mod_b.wat - 参见下面的代码)编译而来的。更准确地说:
;;mod_a.wat
(module $mod_a
(import "mod_b" "square" (func $square (param i32) (result i32)))
(start $start)
;; _start entry point expected by wasm-ld
(func $start
(drop (call $square (i32.const 16)))
)
)
;;mod_b.wat
(module $mod_b
(export "square" (func $square))
(func $square (param $value i32) (result i32)
(i32.mul (local.get $value) (local.get $value))
)
)
$ wat2wasm -r ./mod_a.wat
$ wat2wasm -r ./mod_b.wat
$ wasm-ld-8 ./mod_a.wasm ./mod_b.wasm -o main.wasm
wasm-ld-8: error: entry symbol not defined (pass --no-entry to supress): _start
wasm-ld-8: error: ./mod_a.wasm: undefined symbol: square
我不太明白为什么这两个符号是未定义的(注意:无论我将启动函数命名为 $start 还是 $_start 都不会改变任何事情)。它当然不能解释为什么不能识别平方函数。
有什么想法吗?
谢谢!
【问题讨论】:
-
嗯,
(start $start)和(export "_start" (func $start))真的一样吗?此外,情况似乎从 llvm 8 改善到 11。我现在可以通过将$start重命名为$_start来使您的示例正常工作(我认为这些名称不应该重要。相反,这似乎并不重要是否声明了(start $_start))。
标签: llvm webassembly