[cfe-users] The native "cross compiler" part - how to use it

Norbert Lange via cfe-users cfe-users at lists.llvm.org
Mon Dec 19 15:41:02 PST 2016


I am trying to get my head around how Clang is supposedly used as
Crosscompiler. I am using it for years with a custom gcc toolchain,
but its cumbersome as it involves adding all inlude and library paths
from gcc and adding them as options.
So I tested the arguments that should allow crosscompiling and
compared what they do.

(I am on Debian Strech AMD64, but same or similar issues persist on
older Debian Versions atleast)

echo 'int main(){}' > test.cpp

# Works
clang++ -v test.cpp &> clang_normal.txt

# DOESNT Work. This is the same gcc toolchain clang picked up
automatically with the above command
clang++ --gcc-toolchain=/usr/bin/../lib/gcc/x86_64-linux-gnu/6.2.1 -v
test.cpp &> clang_defaulttc.txt

# installed package g++-arm-linux-gnueabihf
# Works
clang++ --target=arm-linux-gnueabihf -v test.cpp &> clang_crossnormal.txt

 DOESNT Work. This is the same gcc toolchain clang picked up
automatically with the above command
clang++ --target=arm-linux-gnueabihf
--gcc-toolchain=/usr/lib/gcc-cross/arm-linux-gnueabihf/6 -v test.cpp
&> clang_crossdefaulttc.txt

# own cross compiler. Lacks the correct include paths, works otherwise
with the commands below
clang++ --target=arm-none-eabi
-B/opt/hip-toolchain-5/bin/arm-none-eabi- -v test.cpp
--specs=nosys.specs &> clang_extcrosstc.txt

clang++ --target=arm-none-eabi
--sysroot=/opt/hip-toolchain-5/arm-none-eabi -v test.cpp
--specs=nosys.specs &> clang_extcrosstc_s.txt

clang++ --target=arm-none-eabi
--sysroot=/opt/hip-toolchain-5/arm-none-eabi -v test.cpp
--specs=nosys.specs &> clang_extcrosstc_st.txt

# Trick with sysmlinking to clang, this essentially saves the --target
and -B option.
/opt/hip-toolchain-5/bin/arm-none-eabi-clang++ -v test.cpp
--specs=nosys.specs &> clang_extcrosstc_link.txt

# Normalize tempnames for easy comparison
for file in *.txt; do
  sed -e 's,/tmp/test-.*\.o,/tmp/test-000000.o,g' -e
's,/tmp/.*\.res,/tmp/cc000000.res,g' -i $file

The results are attached as file. Findings are:

* Detection of default system compilers seems to work, also with
crosscompilers via --target

* --gcc-toolchain wont work, even if you set the very same value that
clang claims to have used

* --gcc-toolchain doesnt do anything for my cross compiler (tried
several variants with useful paths)

* -B/opt/hip-toolchain-5/bin/arm-none-eabi- makes gcc pickup the right
gcc for linking (would be system gcc otherwise)

* --sysroot=/opt/hip-toolchain-5/arm-none-eabi should pick up the
correct system includes according to
http://clang.llvm.org/docs/CrossCompilation.html. It doesnt (searches
for /usr/include instead of /include)

That means I dont know a way to make --gcc-toolchain usefull, might be
a bug (debian or upstream).
--sysroot similarly doesnt seem to make sense (and -isysroot is even worse)

The only way is adding alot include and library paths for
crosscompilers. using --gcc-toolchain makes even that impossible,
since crtbegin.o wont be found even with the correct added paths?

Is this just insanely buggy, or am I getting it totally wrong?

Using clang with cmake seems to be somewhat easier, since cmake has an
own option for sysroot and manages to do it right
-------------- next part --------------
A non-text attachment was scrubbed...
Name: cross_results.tar.gz
Type: application/x-gzip
Size: 2832 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-users/attachments/20161220/2f792847/attachment.bin>

More information about the cfe-users mailing list