74

How do I set up GCC for cross compiling for the ARM processor? The host would be on x86_64 ( AMD64 - Ubuntu 12.04 ) and the target would be ARM (Raspberry Pi as well as Pandaboard - will do separate compilations for each)?

0

3 Answers 3

69

Install gcc-arm-linux-gnueabi and binutils-arm-linux-gnueabi packages, and then just use arm-linux-gnueabi-gcc instead of gcc for compilation.

You need to be careful on what flavour of linux and binutils you have on your target system. The newest stuff is hardfloat, in this case you would do:

sudo apt-get install gcc-arm-linux-gnueabihf

This brings in the complete cross-compile environment, including binutils.

For using this GCC in the build process write:

CC=arm-linux-gnueabihf-gcc make
5
  • On Ubuntu 13.10 you get gcc-4.7 for 'gnueabi' and gcc-4.8 for 'gnueabihf'. Feb 23, 2014 at 23:34
  • when I tried to compile I got openssl/ossl_typ.h not found error though I already installed libssl-dev.
    – Necktwi
    Sep 10, 2014 at 18:36
  • 1
    If you get source code from apt-get source, after apt-get build-dep you can normally just compile with dpkg-buildpackage -b -uc -us -r Is there a way to build a .deb this easily for ARM without changing the makefile?
    – Jonathan
    Dec 28, 2014 at 4:39
  • @Maratyszcza could you please be more specific regarding the execution of line and then just use arm-linux-gnueabi-gcc instead of gcc for compilation? When I compile I use a call to make which, AFAIK, naturally points to /usr/lib/gcc or something close to that. How could I call arm-linux-gnueabi-gcc directly?
    – Momergil
    Nov 26, 2015 at 17:01
  • 10
    @Momergil CC=arm-linux-gnueabihf-gcc make ... Nov 26, 2015 at 19:05
18

64-bit ARM

For 64-bit ARM, the toolchain prefix is aarch64 and usage is:

sudo apt install gcc-9-aarch64-linux-gnu
aarch64-linux-gnu-gcc -o main.out main.c

You can try it out on this C hello world with QEMU:

main.c

#include <stdio.h>

int main(void) {
    puts("hello");
}

and then:

sudo apt install qemu-user
qemu-aarch64 main.out

will output:

hello

Then a few fun things you can do to quickly see that ARM is actually running under the hood:

Tested in Ubuntu 19.10.

For reliability in serious applications, the disk image provider must also provide a compatible cross compiler

Although you can install a cross compiler with apt conveniently, I must warn you that this is not necessarily reliable unless explicitly supported by the image provider.

If you pick the cross compiler wrongly, the following may happen:

Raspberry PI cross compilation

For RPI in particular, the provided cross compilers are available at: https://github.com/raspberrypi/tools and can be used as explained at: https://raspberrypi.stackexchange.com/questions/64273/installing-raspberry-pi-cross-compiler/83215#83215

git clone https://github.com/raspberrypi/tools
export PATH="$(pwd)/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin:${PATH}"
printf '#include <stdio.h>\nint main() { puts("hello world"); }\n' > hello_world.c
printf '#include <iostream>\nint main() { std::cout << "hello world" << std::endl; }\n' > hello_world.cpp
arm-linux-gnueabihf-gcc -std=c99 -o hello_world_c hello_world.c
arm-linux-gnueabihf-g++ -std=c++11 -o hello_world_cpp hello_world.cpp

Ubuntu cross compilation

If you want to cross compile for Ubuntu arm64, I have never been able to find a clear reference on which cross compilers support which distro version: What are the officially supported cross compilers for Ubuntu server alternative architectures like ARM?

Buildroot

My favorite alternative is to build your own image with Buildroot: https://stackoverflow.com/questions/47557262/how-to-download-the-torvalds-linux-kernel-master-recompile-it-and-boot-it-wi/49349237#49349237

This builds everything from source, including the toolchain and the image, and ensures that everything is compatible.

1
  • I had to additionally install aarch64-linux-gnu-gcc (without an explicit gcc version) Oct 30, 2023 at 18:20
0

AFAIK, if you are just experimenting on your PC, it may be ok to use aarch64-linux-gnu-gcc program.c -static.

This way, there is no need for dynamic linker as the binaries contains everything.

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .