【问题标题】:How to get wasm-ld to honor wasm-import-module attribute如何让 wasm-ld 尊重 wasm-import-module 属性
【发布时间】:2020-05-22 17:39:40
【问题描述】:

已修复:我将要导入的函数的 DLL 存储类设置为 dllimport,这允许 wasm-ld 发出正确的导入命名空间。

我正在使用 LLVMSharp* 库构建编译器,它会发出针对 wasm32-unknown-unknown 的 LLVM .bc 模块文件。我正在尝试通过使用{ "wasm-import-module"="wasi_unstable" } 属性标记这些函数值,将函数从WASI 接口导入其中。 (这应该等同于 clang 对 __attribute__((import_module(<module_name>))) 所做的;参见 here)。但是,当我将生成的 .bc 文件传递​​给 wasm-ld(Windows 64 位 9.0.0 安装版本)时,生成的 .wasm 模块仍会从 "env" 导入这些函数,这不起作用。

是否有一些选项可以传递给 wasm-ld 以使其正确处理 wasm-import-module,还是我需要走另一条路线?

*具体来说,我使用的是 LLVMSharp 5.0.0,它是最新的稳定版本。 LLVMSharp 8.0.0 可能支持构建 .wasm 模块,但没有针对它的发布版 NuGet,并且 beta 版 NuGet 存在一些阻止我升级的问题。这就是我选择 wasm-ld 路线的原因。

【问题讨论】:

  • 欢迎堆栈溢出。请考虑添加一些代码,以便我们帮助您调试。

标签: llvm webassembly wasi


【解决方案1】:

wasm-ld 应该支持这个属性。首先要检查的是您的目标文件。

您可以使用llvm-readobj --syms 转储目标文件中的符号。您应该在符号上看到ImportModule: foo,其中foo 是您在属性中指定的模块名称。

我看起来对这个的支持落在了 wasm-ld 中:https://reviews.llvm.org/D45796

我相信这个变化是在 llvm 8.0 之前出现的,所以你会 llvm 8.0 或更高版本。

【讨论】:

  • 你是对的;目标文件错误。我需要将导入函数的 DLL 存储类设置为dllimport。对于那些像我一样使用 Windows 的人,llvm-nm 工具让我能够查看我的 .bc 文件中的符号——llvm-readobj 工具似乎不存在或无法为 Windows 安装。
  • @BenLeedom 你能分享一下你的 LLVM 是什么样子的吗?
猜你喜欢
  • 1970-01-01
  • 2010-11-04
  • 1970-01-01
  • 1970-01-01
  • 2020-04-13
  • 2022-11-02
  • 2019-08-02
  • 2019-12-31
  • 2022-12-14
相关资源
最近更新 更多