Cross-Compiling GCC in Linux

Nabir14 - Nov 2 - - Dev Community

This is a submission for the 2024 Hacktoberfest Writing challenge: Maintainer Experience

In this article I will help you cross compile gcc in your Linux system. You need a cross-compiled GCC to compile code for multiple platforms from a single development host. I needed this to make my own Operating System from scratch. Dosen't matter what projects your cross compiling for the process is almost same. A note that this article only focuses in cross compiling on Linux systems. If you are on other systems like MacOS the process might be different.

Required Packages:

  • build-essential
  • bison
  • flex
  • libgmp3-dev
  • libmpc-dev
  • libmpfr-dev
  • texinfo
  • libisl-dev

You can install these by typing sudo apt install <package-name> if you use Ubuntu/Debian, sudo dnf install <package-name if you use Fedora or sudo pacman -Syu <package-name> if you use Arch Linux. This depends on your distro.

Cross-Compiling Process:
First you have to set some global variables:

export CC=/usr/bin/gcc 
export LD=/usr/bin/gcc 
export PREFIX="/usr/local/i386elfgcc"
export TARGET=i386-elf
export PATH="$PREFIX/bin:$PATH"
Enter fullscreen mode Exit fullscreen mode

You can get the path of your gcc using which gcc. Then you can set it for CC and LD. PREFIX is where you want your cross-compiled files to be saved in. Target is your target architecture which is the architecture your cross-compiling for. I used x86 (i386) as an example.

Now you have to make a temporary directory to save your downloaded files:

mkdir /tmp/src 
cd /tmp/src
Enter fullscreen mode Exit fullscreen mode

Make the directory and CD into it.

Now, Finally you can start compiling:

curl -O https://ftp.gnu.org/gnu/binutils/binutils-version.tar.gz 
tar xf binutils-version.tar.gz
mkdir binutils-build
cd binutils-build
../binutils-version/configure --target=$TARGET --enable-interwork --enable-multilib --disable-nls --disable-werror --prefix=$PREFIX 2>&1 | tee configure.log
make all install 2>&1 | tee make.log

cd /tmp/src
curl -O https://ftp.gnu.org/gnu/gcc/gcc-version/gcc-version.tar.gz 
tar xf gcc-version.tar.gz 
mkdir gcc-build
cd gcc-build
../gcc-version/configure --target=$TARGET --prefix="$PREFIX" --disable-nls --disable-libssp --enable-languages=c --without-headers
make all-gcc 
make all-target-libgcc 
make install-gcc
make install-target-libgcc
Enter fullscreen mode Exit fullscreen mode

Please replace the version with your binutils and gcc version. For example binutils-version might be binutils-2.40 and gcc-version might be gcc-12.1.0.

This will take some time to compile so get some coffee ☕ (or do anything to pass the time). Then after it's done you will have the usable binaries in your /usr/local/i386elf/bin/ prefixed as i386- (or the architecture of your target if you didn't choose i386 as target). For example your cross compiled gcc might be i386-gcc.

Congratulations 🎉 you have successfully cross-compiled your GCC.

Hello, I am a student and I love programming. If my articles help you and you want to donate then thanks as it will support my education and help me reach my goal! Donate Nabir14

. . .