Cross compilation to ARM bare metal is not working

I am trying to build an LLVM toolchain so that it can cross-compile code to my ARMv7EM-based STM32F7 chip (I want to compile the code on an x86 machine and run it on ARM).

However, a lot of the documents in the web is outdated, pointing to different versions of LLVM (with a different folder structure!) and I am not skilled enough to deduce a right way to build with the scattered information.

I am mainly looking into this: (), and fiddled around to build something that is partially working.

This is the command I am using:

  1. git clone llvm-v9

  2. cd …

  3. mkdir llvm-install && mkdir llvm-build && cd llvm-build


  5. make && make install

It compiles, and if I try to compile C code using the compiled clang, it complains about not having clang_rt on the linking stage (it generates up to assembly file).

I think it is weird that clang_rt is not there because I enable compiler-rt as you can see; anyways, I tried to separately compile clang_rt by looking at

() but it wasn’t successful.

I spent weeks trying out different flag options (some won’t even compile), or using a gcc-arm-none-eabi linker at the last stage, etc., but with no luck.

Can anyone guide me to a more concrete example of how to compile LLVM for ARM cross-compilation, or help me out with what is wrong with the cmake options I am using?

Alternatively, I just tried downloading clang from apt-get install, but that again complained about not having clang_rt.

I would not mind using a lower version of LLVM if that is easier.

Any help or insight would be highly appreciated!

Also, kindly let me know if this is a wrong thread to post. I am new, as you can see.

Thank you,

Best Regards,


LLVM is natively a cross compiler. You don’t need to specify CMAKE_CROSSCOMPILING that option wound signify if you were compiling LLVM to run on arm, not LLVM to generate arm code.

You do need to build compiler-rt for your target, not your host. Cross targeting runtime libraries is a bit more complicated of a build configuration. If you want a full C++ runtime for the bare metal arm you’ll need to remove libcxx, libcxxabi, and compiler-rt from LLVM_ENABLE_PROJECTS and instead spicy them to LLVM_ENABLE_RUNTIMES.

You will also need to set LLVM_BUILTIN_TARGETS and LLVM_RUNTIME_TARGETS to include the triples you want to build the runtimes for. You’ll also need to set the compiler options for those targets so that the proper sysroots can be found.

Probably the best example of this kind of configuration is under clang/cmake/caches/Android-stage2.cmake.