Hi Jérémy, On Sat, May 14, 2022 at 02:44:25PM +0200, Jérémy Lal wrote: > > Addendum: > > "/usr/bin/wasm-ld-13" -m wasm32 -L/usr/lib/wasm32-wasi > > /usr/lib/wasm32-wasi/crt1-reactor.o --entry _initialize -error-limit=0 -O3 > > --lto-O3 --strip-all --allow-undefined --export-dynamic --export-table > > --export=malloc --export=free /tmp/api-1a4e87.o /tmp/http-f5ff3b.o > > /tmp/llhttp-f86505.o -lc -lgcc -o > > /home/dev/Software/debian/node-undici/js-team/lib/llhttp/llhttp.wasm > > wasm-ld-13: error: unable to find library -lgcc > > > > does not fail if I just remove the "-lgcc" flag. > > However, that line is generated by clang. > > To workaround that issue, I found out that a combination of > -nodefaultlibs -Wl,-lc > flags work. > > Still, something's wrong.
I'm not one of the LLVM maintainers, but I was debugging something related today and came across your bug, so thought I'd do a drive-by comment that would perhaps be helpful. A few different things are going on here: * The compiler requires a low-level compiler runtime, as it often emits code that would need to use it. This can either be libgcc, or LLVM's compiler-rt. Clang's default is conditional on the platform, but Debian sets this unconditionally to libgcc (see -DCLANG_DEFAULT_RTLIB=libgcc in llvm's debian/rules). One can set this at runtime, regardless of default, by passing the --rtlib option, such as --rtlib=compiler-rt or --rtlib=libgcc (the latter will always be a no-op on a Debian system, as that is always the default) See https://gcc.gnu.org/onlinedocs/gccint/Libgcc.html for more information about libgcc, and more importantly, clang's reference: https://clang.llvm.org/docs/Toolchain.html#compiler-runtime * I don't believe anyone has ever built gcc/libgcc for a wasm32-wasi target. So the only option to my knowledge here is to use compiler-rt, by passing --rtlib=compiler-rt. * Unfortunately, I don't believe that a wasm32 build of compiler-rt (filename: libclang_rt.builtins-wasm32.a) is shipped by any package in any architecture in Debian. In general, it looks like libclang-common-${version}-dev just ships the architecture-native build, and that no "cross" package exists. For libgcc, cross packages exist, e.g. one can install libgcc-s1-arm64-cross on an amd64 system and get an arm64 binary. (But again, no wasm32 port for libgcc...) * The wasi-sdk project ships libclang_rt.builtins-wasm32.a as part of the SDK tarball, but also separately, in a libclang_rt tarball. For example, with wasi-sdk-16, this can be downloaded here: https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-16/libclang_rt.builtins-wasm32-wasi-16.0.tar.gz This should be extracted under /usr/lib/llvm-14/lib/clang/14.0.6, which would make this file available: /usr/lib/llvm-14/lib/clang/14.0.6/lib/wasi/libclang_rt.builtins-wasm32.a After downloading this file as above, and passing --rtlib=compiler-rt to CFLAGS, the problem you are seeing should be fixed. This bug can probably be retitled/repurposed to request for a way for ship libclang_rt.builtins-wasm32-wasi to be shipped in Debian. (I suspect this may be quite a large endeavor and especially if one were to include the generic case of cross-compiling into this.) Hope this helps! Best, Faidon