【问题标题】:Error linking wasm object files with wasm-ld使用 wasm-ld 链接 wasm 对象文件时出错
【发布时间】: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


【解决方案1】:

wat2wasm 的 -r 标志仅支持最低限度的 wasm 目标文件格式。例如,它不支持写出符号表,这无疑使它相当无用。今天生成可链接目标文件的最佳选择是使用 llvm(使用 clang 或 .s 格式的手写程序集)。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-22
  • 1970-01-01
  • 2021-11-04
  • 2020-02-29
  • 2021-05-27
  • 2021-09-01
  • 1970-01-01
相关资源
最近更新 更多