Crosscompiling with clang-8

I am attempting to create an environment to crosscompile code from x86_64 to aach64 (nVidia Jetson). I’m using the toolchain provided by nVidia (really, Linaro), and things seem to be generally working, when I use the following sample script:

export clangver=13
export CC=clang-$clangver
export CXX=clang++-$clangver

export toolchain=/opt/toolchains/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu
export archname=aarch64-linux-gnu
export PATH=$toolchain/bin:$PATH

export LD=$archname-ld
export AS=$CC
export AR=$archname-ar
export FC=$archname-gfortran


export FN=/tmp/foo.cpp

echo "#include <stdio.h>" > $FN
echo "#include <cstddef>" >> $FN
echo "int main(int argv, char** argc)" >> $FN
echo "{" >> $FN
echo "printf(\"Hello, cross!\\n\");" >> $FN
echo "	return 0;" >> $FN
echo "}" >> $FN


$CXX --verbose -mcpu=cortex-a57 \
    --target=$archname \
    --sysroot=$toolchain/$archname/libc \
    --gcc-toolchain=$toolchain \
    $FN

However, once I try to switch clang from 13 to 8 (which I need to – CUDA 10.2 cannot use clang later than 8, and Jetson 4.4/4.6 are using CUDA 10.2), I get the following error:

 "/usr/bin/ld" --sysroot=/opt/toolchains/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu/aarch64-linux-gnu/libc -EL -z relro --hash-style=gnu --build-id --eh-frame-hdr -m aarch64linux -dynamic-linker /lib/ld-linux-aarch64.so.1 -o a.out /opt/toolchains/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu/aarch64-linux-gnu/libc/usr/lib/crt1.o /opt/toolchains/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu/aarch64-linux-gnu/libc/usr/lib/crti.o /opt/toolchains/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu/lib/gcc/aarch64-linux-gnu/7.3.1/crtbegin.o -L/opt/toolchains/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu/lib/gcc/aarch64-linux-gnu/7.3.1 -L/opt/toolchains/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu/lib/gcc/aarch64-linux-gnu/7.3.1/../../../../aarch64-linux-gnu/lib/../lib64 -L/opt/toolchains/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu/lib/gcc/aarch64-linux-gnu/7.3.1/../../../../aarch64-linux-gnu/lib -L/opt/toolchains/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu/aarch64-linux-gnu/libc/lib -L/opt/toolchains/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu/aarch64-linux-gnu/libc/usr/lib /tmp/foo-c8a68b.o -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /opt/toolchains/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu/lib/gcc/aarch64-linux-gnu/7.3.1/crtend.o /opt/toolchains/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu/aarch64-linux-gnu/libc/usr/lib/crtn.o
/usr/bin/ld: unrecognised emulation mode: aarch64linux
Supported emulations: elf_x86_64 elf32_x86_64 elf_i386 elf_iamcu i386linux elf_l1om elf_k1om i386pep i386pe
clang: error: linker command failed with exit code 1 (use -v to see invocation)

As you see, clang-8 insists on using the system’s, rather than toolchain’s ld. Is there a way to clue it in, and make it use toolchain’s ld?

Use -B?

1 Like

Yep, that helps – as well as -fuse-ld=$toolchain/bin/$LD. Thanks.