我有一个C Wasm模块,具有以下导入:
__attribute__((import_module("env"), import_name("runtime_exit"))) void exit(int);
我在Linux上编译Clang 12.0.0:
clang --target=wasm32 --no-standard-libraries
-c -Ofast -o out.o in.c
对于来自我的包管理器(xbps)的包,这工作得很好。然而,在Nix(参见下面的推导)中(Clang 12.0.1),我在nix-build
上得到以下警告:
tests/test.h:1:16: warning: unknown attribute 'import_module' ignored [-Wunknown-attributes]
__attribute__((import_module("env"), import_name("runtime_exit"))) void exit(int);
^~~~~~~~~~~~~~~~~~~~
tests/test.h:1:38: warning: unknown attribute 'import_name' ignored [-Wunknown-attributes]
__attribute__((import_module("env"), import_name("runtime_exit"))) void exit(int);
这只是一个警告,但是随后的连接失败了:事实上,clang试图连接ld
,而不是wasm-ld
甚至lld
。
我的default.nix
指定:
{ pkgs ? import <nixpkgs> {} }:
let
stdenv = pkgs.llvmPackages_12.stdenv;
src = ./.; # etc, etc
in
stdenv.mkDerivation {
# --- snip ---
buildPhase = ''
clang --target=wasm32 --no-standard-libraries
-c -Ofast -o $out/out.o in.c
'';
# --- snip ---
buildInputs = [ pkgs.clang_12 pkgs.lld_12 ];
}
我不明白为什么这不应该工作,但是我尝试使用的所有不同版本的软件包似乎都表明我对LLVM工具链的理解不正确。
如果这些信息还不够,请告诉我。谢谢!编辑
看起来Nix没有遵守——target参数:
$ nix-shell
[nix-shell:~/...]$ clang -target wasm32 --print-target-triple
x86_64-unknown-linux-gnu
[nix-shell:~/...]$ exit
$ clang --target=wasm32 --print-target-triple
wasm32
尽管如此,clang仍然是一个可用的目标。
Nix给出的clang包装器脚本似乎做了一些的事情。编译器应该使用clang-[VERSION]
而不是clang
来调用,例如:
clang-12 --target=wasm32 --no-standard-libraries
-c -std=c99 -Ofast -Wall -Werror -pedantic
input.c -o output.o