如何使用共享内存编译标志链接wasi-libc并解决wasm-ld报错
WASM共享内存链接报错解决方案
你的报错根源是当前使用的预编译wasi-libc库内的目标文件(如报错提及的errno.o)编译时未开启atomics、bulk-memory特性,这类编译时的特性标记是硬编码在目标文件中的,仅向链接器传递参数无法修改已编译文件的标记,必须使用对应参数重新编译wasi-libc才能解决问题,无需尝试修改链接参数绕过该检查。
具体操作步骤如下:
- 拉取wasi-libc官方源码
- 编译wasi-libc时给C/C++编译器添加上特性参数,示例编译命令:
如果你需要配套pthread支持,可在参数中额外添加make CC=clang \ CFLAGS="-matomics -mbulk-memory" \ CXXFLAGS="-matomics -mbulk-memory" \ install-pthread,同时指定TARGET=wasm32-wasi-threads编译对应目标版本的libc。 - 替换项目中使用的wasi-libc库文件为新编译的版本,调整链接路径确保优先加载你编译的带特性标记的库。
- 确认自有代码的编译、链接参数正确:
- 所有自有代码编译时保留
-matomics -mbulk-memory参数 - 链接阶段向wasm-ld传递
--shared-memory参数,若通过clang/clang++驱动链接,参数写法为-Wl,--shared-memory
- 所有自有代码编译时保留
如果你使用的是较新版本的wasi-sdk,可直接在编译自有代码时指定目标为wasm32-wasi-threads,工具链会自动调用预编译的带原子、共享内存支持的wasi-libc版本,无需手动编译源码。
内容的提问来源于stack exchange,提问作者Denis Belov
相关产品推荐
相关产品推荐

