Skip to content

Instantly share code, notes, and snippets.

@joennlae
Forked from chponte/gnu-toolchain.md
Created July 18, 2022 08:30
Show Gist options
  • Save joennlae/447859a988e28a02b18641ec2d435393 to your computer and use it in GitHub Desktop.
Save joennlae/447859a988e28a02b18641ec2d435393 to your computer and use it in GitHub Desktop.
Building a complete GNU toolchain, comprised of binutils + gcc + glibc

Building a complete GNU toolchain

Things required:

Environment variables

These variables control the target architecture, and installation directory.

export TARGET=x86_64-pc-linux-gnu
export PREFIX=$HOME/gcc/x.x.x
export TARGET_PREFIX=$PREFIX/$TARGET
export PATH=$PREFIX/bin:$PATH

Linux headers

cd linux-x.x.x
make ARCH=$(echo $TARGET | cut -d '-' -f 1) INSTALL_HDR_PATH=$TARGET_PREFIX headers_install

Binutils

mkdir binutils-build
cd binutils-build
../binutils-x.x.x/configure --target=$TARGET --prefix=$PREFIX --disable-nls -v
make -j$(nproc) all install

GCC (first-stage)

May need the additional configure flag --disable-multilib if there are no 32-bit system libraries installed on the system. Note that --with-newlib does not refer to the newlib C library.

cd gcc-x.x.x
./contrib/download_prerequisites
cd ..
mkdir gcc-build
cd gcc-build
../gcc-x.x.x/configure --target=$TARGET --prefix=/tmp/gcc-first-stage --without-headers --with-newlib -v
make -j$(nproc) all-gcc all-target-libgcc install-gcc install-target-libgcc

glibc

cd glibc-x.x
CC=/tmp/gcc-first-stage/bin/gcc ../glibc-x.x/configure --target=$TARGET --prefix=$PREFIX --with-headers=${TARGET_PREFIX}/include --without-selinux
make -j$(nproc) all install

GCC (final)

May need again --disable-multilib.

cd gcc-build
rm -rf *
../gcc-x.x.x/configure --target=$TARGET --prefix=$PREFIX --enable-languages=c,c++
make -j$(nproc) all install

Using the new toolchain

In order to use the new compiler together with the new glibc, call gcc/g++ with the following linking flags:

-L$PREFIX/lib -L$PREFIX/lib64 -L$TARGET_PREFIX/lib -I$PREFIX/include -I$TARGET_PREFIX/include -Wl,--rpath=$PREFIX/lib -Wl,--rpath=$PREFIX/lib64 -Wl,--rpath=$TARGET_PREFIX/lib -Wl,--dynamic-linker=$PREFIX/lib/ld-linux-x86-64.so.2

References

  1. https://www6.software.ibm.com/developerworks/education/l-cross/l-cross-ltr.pdf
  2. https://stackoverflow.com/questions/62651270/glibc-configure-doesnt-recognize-linux-header-files
  3. https://stackoverflow.com/questions/22707265/how-to-build-libgcc-of-gcc-compiler
  4. https://gcc.gnu.org/install/configure.html
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment