无法在 Linux 上编译为 .wasm
Can't compile to .wasm on Linux
总结
(编辑:删除了所有不必要的信息,添加了 Windows10 经验,将 Ubuntu 上的 CLANG 升级到相同版本,由于旧的 CLANG 版本删除了 Debian10)
我创建了一个非常简单的 WASM 模块,
- 在 MacOS 上编译,有效 ✅,
- 在 MS-Windows10 上编译,有效 ✅,
- 在 Ubuntu21.10 上编译:产生 318 个字节的零 ❌,
详情
症状
在 Ubuntu21,linker 生成了长度正确但全是零的文件:
$ hexdump inc.wasm
0000000 0000 0000 0000 0000 0000 0000 0000 0000
*
0000130 0000 0000 0000 0000 0000 0000 0000
000013e
编译器还会生成一个名为 inc.wasm.tmp611a2df
的临时文件,它与结果 inc.wasm
相同,大小相同,零字节内容。
构建命令
编译命令:
clang++ \
--target=wasm32 \
-nostdlib \
-O3 \
-o /tmp/inc.o \
-c \
inc.cpp
它可以在任何平台上生成良好的目标文件(在 Ubuntu 上编译,然后 link 在 MS-Windows10 上编译:有效)。
link 命令是(在 MS-Windows10 上,用于插入符号“^”而不是反斜杠“”):
wasm-ld \
--no-entry \
--export-all \
--lto-O3 \
--allow-undefined \
--import-memory \
/tmp/inc.o \
-o inc.wasm
版本
苹果操作系统:
$ clang --version
Homebrew clang version 13.0.1
Target: x86_64-apple-darwin21.3.0
Thread model: posix
InstalledDir: /usr/local/opt/llvm/bin
Ubuntu 21.10:
编译器版本:
$ clang --version
Ubuntu clang version 14.0.0-++20220316013357+add3ab7f4c8a-1~exp1~20220316133449.102
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
链接器版本:
$ wasm-ld --version
Ubuntu LLD 14.0.0
底线
在带有 CLANG 版本 7 的 Debian10 上使用 strace,
它在创建结果文件后挂起,我将 strace 输出复制到这里,但请记住,它是不同的版本:
futex(0x7f514f8dc428, FUTEX_WAKE_PRIVATE, 2147483647) = 0
futex(0x7f514f8dc0c8, FUTEX_WAKE_PRIVATE, 2147483647) = 0
futex(0x7f514f8dc9d0, FUTEX_WAKE_PRIVATE, 2147483647) = 0
futex(0x7f514f8dc9d8, FUTEX_WAKE_PRIVATE, 2147483647) = 0
openat(AT_FDCWD, "/tmp/inc.o", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=1556, ...}) = 0
pread64(3, "[=17=]asm[=17=][=17=][=17=]4000[=17=]`77`[=17=][=17=]`77[=17=]`77"..., 1556, 0) = 1556
close(3) = 0
brk(0x1048000) = 0x1048000
brk(0x1046000) = 0x1046000
stat("inc.wasm", 0x7ffc2e13ec08) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/dev/urandom", O_RDONLY) = 3
read(3, "6'26", 4) = 4
close(3) = 0
openat(AT_FDCWD, "inc.wasm.tmp0b96c6e", O_RDWR|O_CREAT|O_EXCL|O_CLOEXEC, 0777) = 3
fallocate(3, 0, 0, 1507) = 0
ftruncate(3, 1507) = 0
mmap(NULL, 1507, PROT_READ|PROT_WRITE, MAP_SHARED, 3, 0) = 0x7f514f918000
sched_getaffinity(0, 128, [0]) = 64
openat(AT_FDCWD, "/sys/devices/system/cpu/online", O_RDONLY|O_CLOEXEC) = 4
read(4, "0\n", 8192) = 2
close(4) = 0
mmap(NULL, 8392704, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7f514af2b000
mprotect(0x7f514af2c000, 8388608, PROT_READ|PROT_WRITE) = 0
clone(child_stack=0x7f514b72afb0, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7f514b72b9d0, tls=0x7f514b72b700, child_tidptr=0x7f514b72b9d0) = 23331
futex(0x7ffc2e13eee8, FUTEX_WAIT_PRIVATE, 0, NULL
我不知道发生了什么。
我的两个 Linux 虚拟机只是运气不好。一位朋友在他的 Arch Linux 上安装了 wasm-ld
,它运行正常 out-of-the-box。
我已经将我的 Debian10 机器升级到 Debian11,安装了 wasm-ld-13
,它运行正常。
总结
(编辑:删除了所有不必要的信息,添加了 Windows10 经验,将 Ubuntu 上的 CLANG 升级到相同版本,由于旧的 CLANG 版本删除了 Debian10)
我创建了一个非常简单的 WASM 模块,
- 在 MacOS 上编译,有效 ✅,
- 在 MS-Windows10 上编译,有效 ✅,
- 在 Ubuntu21.10 上编译:产生 318 个字节的零 ❌,
详情
症状
在 Ubuntu21,linker 生成了长度正确但全是零的文件:
$ hexdump inc.wasm
0000000 0000 0000 0000 0000 0000 0000 0000 0000
*
0000130 0000 0000 0000 0000 0000 0000 0000
000013e
编译器还会生成一个名为 inc.wasm.tmp611a2df
的临时文件,它与结果 inc.wasm
相同,大小相同,零字节内容。
构建命令
编译命令:
clang++ \
--target=wasm32 \
-nostdlib \
-O3 \
-o /tmp/inc.o \
-c \
inc.cpp
它可以在任何平台上生成良好的目标文件(在 Ubuntu 上编译,然后 link 在 MS-Windows10 上编译:有效)。
link 命令是(在 MS-Windows10 上,用于插入符号“^”而不是反斜杠“”):
wasm-ld \
--no-entry \
--export-all \
--lto-O3 \
--allow-undefined \
--import-memory \
/tmp/inc.o \
-o inc.wasm
版本
苹果操作系统:
$ clang --version
Homebrew clang version 13.0.1
Target: x86_64-apple-darwin21.3.0
Thread model: posix
InstalledDir: /usr/local/opt/llvm/bin
Ubuntu 21.10:
编译器版本:
$ clang --version
Ubuntu clang version 14.0.0-++20220316013357+add3ab7f4c8a-1~exp1~20220316133449.102
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
链接器版本:
$ wasm-ld --version
Ubuntu LLD 14.0.0
底线
在带有 CLANG 版本 7 的 Debian10 上使用 strace, 它在创建结果文件后挂起,我将 strace 输出复制到这里,但请记住,它是不同的版本:
futex(0x7f514f8dc428, FUTEX_WAKE_PRIVATE, 2147483647) = 0
futex(0x7f514f8dc0c8, FUTEX_WAKE_PRIVATE, 2147483647) = 0
futex(0x7f514f8dc9d0, FUTEX_WAKE_PRIVATE, 2147483647) = 0
futex(0x7f514f8dc9d8, FUTEX_WAKE_PRIVATE, 2147483647) = 0
openat(AT_FDCWD, "/tmp/inc.o", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=1556, ...}) = 0
pread64(3, "[=17=]asm[=17=][=17=][=17=]4000[=17=]`77`[=17=][=17=]`77[=17=]`77"..., 1556, 0) = 1556
close(3) = 0
brk(0x1048000) = 0x1048000
brk(0x1046000) = 0x1046000
stat("inc.wasm", 0x7ffc2e13ec08) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/dev/urandom", O_RDONLY) = 3
read(3, "6'26", 4) = 4
close(3) = 0
openat(AT_FDCWD, "inc.wasm.tmp0b96c6e", O_RDWR|O_CREAT|O_EXCL|O_CLOEXEC, 0777) = 3
fallocate(3, 0, 0, 1507) = 0
ftruncate(3, 1507) = 0
mmap(NULL, 1507, PROT_READ|PROT_WRITE, MAP_SHARED, 3, 0) = 0x7f514f918000
sched_getaffinity(0, 128, [0]) = 64
openat(AT_FDCWD, "/sys/devices/system/cpu/online", O_RDONLY|O_CLOEXEC) = 4
read(4, "0\n", 8192) = 2
close(4) = 0
mmap(NULL, 8392704, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7f514af2b000
mprotect(0x7f514af2c000, 8388608, PROT_READ|PROT_WRITE) = 0
clone(child_stack=0x7f514b72afb0, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7f514b72b9d0, tls=0x7f514b72b700, child_tidptr=0x7f514b72b9d0) = 23331
futex(0x7ffc2e13eee8, FUTEX_WAIT_PRIVATE, 0, NULL
我不知道发生了什么。
我的两个 Linux 虚拟机只是运气不好。一位朋友在他的 Arch Linux 上安装了 wasm-ld
,它运行正常 out-of-the-box。
我已经将我的 Debian10 机器升级到 Debian11,安装了 wasm-ld-13
,它运行正常。