【问题标题】:How to link wasi-libc with shared memory flag?如何将 wasi-libc 与共享内存标志链接?
【发布时间】:2021-12-01 07:15:40
【问题描述】:

我想在我的 WASM 模块中导入共享内存,并尝试链接我所有使用 -matomics-mbulk-memory 以及 wasi-libc -lclc++-lc++abi 库编译的目标文件。但是出现错误:

wasm-ld: error: --shared-memory 被 errno.o 禁止,因为它没有使用“atomics”或“bulk-memory”特性进行编译。

据我了解,wasm-ld 链接了一些 libc 目标文件,编译时没有上面的标志,因此无法链接。我怎样才能将这些标志提供给链接器?还是需要使用这些标志从源代码构建 wasi-libc?

【问题讨论】:

    标签: clang webassembly


    【解决方案1】:

    问题已通过在链接时指定 --no-check-features 标志解决。

    【讨论】:

      【解决方案2】:

      wasi-libc 目前不支持共享内存或多线程。如果您想尝试使某些工作正常工作,您至少需要使用 -pthread 编译器标志重新编译核心库(libc、compiler-rt、libcxx、libcxxabi)。

      如果您想从今天(2021 年)起将多线程与 WebAssembly 一起使用,唯一合理的选择是使用 emscripten 及其基于 Web Worker 的多线程方法。

      【讨论】:

      • 感谢您的回答。但是我通过将--no-check-features 标志添加到wasm-ld 解决了这个问题。我没有使用 C 级多线程,而是使用 JS SharedArrayBuffer。我正在从 WASM 模块创建多个实例,它们很好地使用了来自不同工作人员的共享缓冲区。
      • 您打算如何处理通常需要锁定的部分 libc,例如malloc?如果你打算使用 malloc/free 来管理你的内存,那么使用 wasi-sdk 中的 libc 版本是不安全的(因为它是在没有锁定的情况下构建的)。仅供参考。如果您为每个模块分配其自己独特的非重叠内存部分,那么您应该没问题。
      • 我在生成工人之前从主要工人分配所有内存。并且工作人员正在使用相同的内存区域进行操作,但不分配内存。现在没有任何问题。有一些内置的 WASM 原子函数,所以我想我会尝试在其他情况下使用它。
      • 也许您知道将标准库链接到 WASM 代码的其他方法?我试图链接 clang libc/libc++,但它失败了,因为我只能使用它的头文件而不是二进制文件,因为它显然不是编译为 WASM 字节码。 Wasi-libc 工作正常,但我想知道在浏览器中使用标准库是否正确?
      • 如果您使用 wasi-libc 并与 clang++ 链接,它将默认包含 libc++。 libc++ 是 wasi-sdk 的一部分,就像 libc(以及 libcompiler-rt 和 libc++abi)一样。您不需要显式链接任何这些库,clang/clang++ 驱动程序会为您完成。
      猜你喜欢
      • 2021-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多