[cfe-dev] Cross compiling with clang (and sysroot support)

Stephen Kelly steveire at gmail.com
Wed Apr 24 08:27:29 PDT 2013

Tim Northover wrote:

> Hi Steve,
>>  /usr/bin/arm-linux-gnueabi-gcc-4.7 main.c
>> 'Just Works'. /usr/bin/arm-linux-gnueabi-as also exists.
> In that case, I'd suggest using "-target arm-linux-gnueabi" as a
> starting-point. Clang does use this target in its search for an
> appropriate assembler and linker. I think I concluded that it'll find
> it if arm-linux-gnueabi-as is on the path, but I'm not certain.
> Other than that, the key point is where the ARM libraries and headers
> are. There's a chance Clang will find them by itself with the correct
> -target option. If not, the --sysroot option is what you'll have to
> use to give it a hint.

Thanks, that is progress at least:

 stephen at hal:/tmp$ clang -target arm-linux-gnueabi main.c 
 /usr/bin/arm-linux-gnueabi-ld: cannot find crt1.o: No such file or 
 /usr/bin/arm-linux-gnueabi-ld: cannot find crti.o: No such file or 
 /usr/bin/arm-linux-gnueabi-ld: cannot find crtbegin.o: No such file or 
 /usr/bin/arm-linux-gnueabi-ld: cannot find -lgcc
 /usr/bin/arm-linux-gnueabi-ld: cannot find -lgcc_s
 clang: error: linker command failed with exit code 1 (use -v to see 


 locate crtbegin.o | grep arm



which looks appropriate. But what should I pass in the --sysroot? 

I tried using /usr/lib/gcc-cross/arm-linux-gnueabi/4.7/ and also all parent 
directories of it, with the same result as above each time.

>> All I need is some way to cross compile something for some platform, so
>> if I can invoke clang in a way that it will use that cross-as, that would
>> be great.
> A parallel option would be to add "-integrated-as" as an option. Then
> Clang does the assembly step itself. I didn't mention it because you'd
> still need the linker to produce a working binary.

Right. Using that I get a linker error because it uses the wrong linker:

 stephen at hal:/tmp$ clang -target armv7--eabi -integrated-as main.c 
 /usr/bin/ld: unknown architecture of input file `/tmp/main-CFNTHI.o' is 
incompatible with i386:x86-64 output
 collect2: error: ld returned 1 exit status
 clang: error: linker (via gcc) command failed with exit code 1 (use -v to 
see invocation)



More information about the cfe-dev mailing list