The basic procedure for building a cross-compiler is:
- Obtain headers specific to the operating system
- Build binutils for the target platform
- Build a bootstrap compiler
- Build a standard C library for the target
- Build the final cross-compiler, using the C library just built
$ export TARGET=powerpc64-unknown-linux-gnu $ export PREFIX=/opt/crosscompiler $ export TARGET_PREFIX=$PREFIX/$TARGET $ export PATH=$PATH:$PREFIX/bin
Obtaining Linux-specific Headers
I've followed the developerWorks tutorial on this one: Downloaded and extracting the Linux kernel sources, then copied the relevant files. Here are the commands I ran:$ wget http://kernel.org/pub/linux/kernel/v2.6/linux-2.6.25.9.tar.bz2 $ tar xvjf linux-2.6.25.9.tar.bz2 $ cd linux-2.6.25.9 $ make ARCH=powerpc CROSS_COMPILE=powerpc64-linux- menuconfig (configure options, but tweaking isn't neccessary) $ mkdir -p $TARGET_PREFIX/include $ cp -r include/linux $TARGET_PREFIX/include $ cp -r include/asm-powerpc $TARGET_PRFIX/include/asm $ cp -r include/asm-generic $TARGET_PREFIX/includeIf you read to the end of this post, then you'll realize that this step wouldn't be required (for now).
Building GNU binutils
I'm using GNU binutils 2.18, available from the GNU website. These are the steps required to build binutils.$ wget $ tar xjvf $ ./configure --prefix=$PREFIX --target=$TARGET --disable-nls -v $ make all $ make installWhile building binutils did take a while, it wasn't as long as the tutorial makes you believe. On a IBM Thinkpad T60p built around a Centrino Duo CPU running at 2.16 MHz it took less than 10 minutes. Also note the last command ("make install"), which is missing from the developerWorks tutorial.
Building a bootstrap compiler
For my project I need GCC 4.x, the latest version at the time of writing is 4.3.1 which is available from a GNU mirror near you. Downloading and extracting is easy:$ wget ftp://ftp.gwdg.de/pub/misc/gcc/releases/gcc-4.3.1/gcc-4.3.1.tar.bz2 $ tar xjvf gcc-4.3.1.tar.bz2 $ cd gcc-4.3.1Here are the steps required to build a bootstrap compiler.
$ ./configure --prefix=$PREFIX --target=$TARGET --without-headers \ --with-newlib -v $ make all-gcc $ make install-gccThis took longer than building binutils, however it took less than 30 minutes (as opposed to the hours the tutorial talks about).
Building the GNU C Library (glibc)
$ CC=${TARGET}-gcc ./configure --target=$TARGET --prefix=$PREFIX \ --with-headers=${TARGET_PREFIX}/includeUnfortunately, this command failed with the following error:
(...) checking whether __attribute__((visibility())) is supported... no configure: error: compiler support for visibility attribute is requiredHowever, this isn't important as I won't need a standard C library for now - I'm building with -ffreestanding and -nostdlib anyways. Therefore I've decided that I won't pursue this futher but may come back later.