[llvm-dev] Trying to create a pure LLVM toolchain on musl based distribution

David Demelier via llvm-dev llvm-dev at lists.llvm.org
Mon Mar 25 05:52:40 PDT 2019


Hello,

I'm trying to create a pure LLVM toolchain (that will not depend on GNU 
and produce GNU-free code too) on a musl based distribution.

For now, I use gcc to bootstrap and build all LLVM components. I do it 
individually because I was running out of space and memory trying to 
build all using LLVM_ENABLE_PROJECTS. Also, I don't want to create a 
all-in-one package. Then, once I'm able to build program with clang, 
I'll rebuild all using clang instead of gcc.

# LLVM

I've built LLVM using the following configuration:

     -DCMAKE_BUILD_TYPE=Release
     -DBUILD_SHARED_LIBS=On
     -DCMAKE_INSTALL_PREFIX=/usr
     -DLLVM_HOST_TRIPLE=x86_64-linux-musl
     -DLLVM_ENABLE_RTTI=On

# compiler-rt

I've needed to disable xray/sanitizers otherwise it didn't build on musl.

     -DCMAKE_BUILD_TYPE=Release
     -DCMAKE_INSTALL_PREFIX=/usr
     -DCOMPILER_RT_BUILD_BUILTINS=On
     -DCOMPILER_RT_BUILD_SANITIZERS=Off
     -DCOMPILER_RT_BUILD_XRAY=Off
     -DCOMPILER_RT_USE_BUILTINS_LIBRARY=On

# libc++

     -DBUILD_SHARED_LIBS=On
     -DCMAKE_BUILD_TYPE=Release
     -DCMAKE_INSTALL_PREFIX=/usr
     -DLIBCXX_HAS_MUSL_LIBC=On
     -DLIBCXX_HAS_GCC_S_LIB=Off
     -DLIBCXX_ENABLE_STATIC=Off

# libc++abi

     -DBUILD_SHARED_LIBS=On
     -DCMAKE_BUILD_TYPE=Release
     -DCMAKE_INSTALL_PREFIX=/usr
     -DLIBCXXABI_ENABLE_STATIC=Off

# libunwind

     -DBUILD_SHARED_LIBS=On
     -DCMAKE_BUILD_TYPE=Release
     -DCMAKE_INSTALL_PREFIX=/usr
     -DLIBUNWIND_ENABLE_STATIC=Off
     -DLIBUNWIND_USE_COMPILER_RT=On

# clang

And finally clang:

     -DBUILD_SHARED_LIBS=On
     -DCMAKE_BUILD_TYPE=Release
     -DCMAKE_INSTALL_PREFIX=/usr
     -DCLANG_DEFAULT_CXX_STDLIB=libc++
     -DCLANG_DEFAULT_LINKER=lld
     -DCLANG_DEFAULT_RTLIB=compiler-rt
     -DCLANG_VENDOR="Vanilla Linux"

Everything built fine, now the problem is the location of compiler-rt 
libraries which are not the correct place where clang/ld.lld searches. 
As the following output shows:

clang -v /tmp/test.c
Vanilla Linux clang version 8.0.0 (tags/RELEASE_800/final) (based on 
LLVM 8.0.0)
Target: x86_64-unknown-linux-musl
Thread model: posix
InstalledDir: /usr/bin
  "/usr/bin/clang-8" -cc1 -triple x86_64-unknown-linux-musl -emit-obj 
-mrelax-all -disable-free -disable-llvm-verifier -discard-value-names 
-main-file-name test.c -mrelocation-model pic -pic-level 2 -pic-is-pie 
-mthread-model posix -mdisable-fp-elim -fmath-errno -masm-verbose 
-mconstructor-aliases -munwind-tables -fuse-init-array -target-cpu 
x86-64 -dwarf-column-info -debugger-tuning=gdb -v -resource-dir 
/usr/lib/clang/8.0.0 -internal-isystem /usr/local/include 
-internal-isystem /usr/lib/clang/8.0.0/include -internal-externc-isystem 
/include -internal-externc-isystem /usr/include -fdebug-compilation-dir 
/usr/src/vanilla -ferror-limit 19 -fmessage-length 184 
-fobjc-runtime=gcc -fdiagnostics-show-option -o /tmp/test-1d99ce.o -x c 
/tmp/test.c -faddrsig
clang -cc1 version 8.0.0 based upon LLVM 8.0.0 default target 
x86_64-linux-musl
ignoring nonexistent directory "/include"
#include "..." search starts here:
#include <...> search starts here:
  /usr/local/include
  /usr/lib/clang/8.0.0/include
  /usr/include
End of search list.
  "/usr/bin/ld.lld" -pie --eh-frame-hdr -m elf_x86_64 -dynamic-linker 
/lib/ld-musl-x86_64.so.1 -o a.out /usr/bin/../lib/Scrt1.o 
/usr/bin/../lib/crti.o crtbeginS.o -L/usr/bin/../lib -L/lib -L/usr/lib 
/tmp/test-1d99ce.o 
/usr/lib/clang/8.0.0/lib/linux/libclang_rt.builtins-x86_64.a -lc 
/usr/lib/clang/8.0.0/lib/linux/libclang_rt.builtins-x86_64.a crtendS.o 
/usr/bin/../lib/crtn.o
ld.lld: error: cannot open crtbeginS.o: No such file or directory
ld.lld: error: cannot open 
/usr/lib/clang/8.0.0/lib/linux/libclang_rt.builtins-x86_64.a: No such 
file or directory
ld.lld: error: cannot open 
/usr/lib/clang/8.0.0/lib/linux/libclang_rt.builtins-x86_64.a: No such 
file or directory
ld.lld: error: cannot open crtendS.o: No such file or directory
clang-8: error: linker command failed with exit code 1 (use -v to see 
invocation)

compiler-rt installed files under the following directories hierarchy 
instead:

usr/lib/linux/libclang_rt.builtins-x86_64.a
usr/lib/linux/libclang_rt.fuzzer-x86_64.a
usr/lib/linux/libclang_rt.fuzzer_no_main-x86_64.a
usr/lib/linux/libclang_rt.profile-x86_64.a

What did I misconfigured? Is it clang/lld or compiler-rt? Also do I need 
to do something else regarding crtbeginS.o and crtendS.o that are not 
provided by musl?

Regards,

-- 
David


More information about the llvm-dev mailing list