Cross Compiling

From PS3 Developer wiki
Revision as of 22:21, 21 May 2011 by Korben (talk | contribs)
Jump to navigation Jump to search

Cross Compiling

This page shows how to cross compile for CellBE/ppc64


Gentoo

Server: Emerge distcc crossdev & env-update & source /etc/profile & crossdev -t powerpc64-unknown-linux-gnu

Client: http://www.gentoo.org/doc/en/cross-compiling-distcc.xml (Because it's much better written than anything I could do)

Debian/Debian-based

Know your host System

To be improve the building time it is a good idea to know how many cores your processor has and have that number of concurrent jobs.

To know how many cores you have available use :

grep -c '^processor' /proc/cpuinfo

This will be used later on while building the toolchain ct-ng build.#number of cores and while compiling export CONCURRENCY_LEVEL=#number of cores.

Example for a quadcore system :

ct-ng build.4
CONCURRENCY_LEVEL=4


Installing Cross Tool

Install required packages :

sudo apt-get install build-essential gawk bison flex automake libtool cvs lzma ncurses-dev texinfo patch g++ gcj mercurial git-core

Add the enviromental variable to bash :

sudo vi /etc/bash.bashrc

or

vi /home/user/.bashrc

Add the following lines at the end of the file :


export PATH="${PATH}:/home/user/crosstool/bin/"

export PATH="${PATH}:/home/user/x-tools/powerpc64-unknown-linux-gnu/bin/"

export CONCURRENCY_LEVEL=#number


Create directories and compile crosstool :

mkdir /home/user/crosstool
mkdir /home/user/kernel
mkdir -p /home/user/toolchain/powerpc
hg clone http://crosstool-ng.org/hg/crosstool-ng
cd crosstool-ng
./configure --prefix=/home/user/crosstool/
make && make install
  • /home/user/crosstool-ng/ -> crostool-ng sources
  • /home/user/crosstool/ -> Crosstool install directory with binaries
  • /home/user/toolchain/ -> Directory where the binary will be installed
  • /home/user/toolchain/powerpc/ -> Crosstool files generated in this tutorial for powerpc
  • /home/user/toolchain/x-tools/ -> generated toolchain
  • /home/user/kernel -> Place were graf_chokolo's linux kernel tarball will be saved

Patching crosstool

NOTE : MAYBE THIS PATCHING STEP IS USELESS WITH LASTEST CROSSTOOL-NG REVISION

For some reason, the compiler removes the symbolic links for lib64.

The following patch corrects this behaviour allowing the toolchain to work properly without further modifications.

Required Patch

save the following file as """important.patch""" in home/user/crosstool/lib/ct-ng-1.10.0/scripts/build

diff --git a/scripts/build/internals.sh b/scripts/build/internals.sh
--- a/scripts/build/internals.sh
+++ b/scripts/build/internals.sh
@@ -157,8 +157,6 @@
     # the standard lib/ dirs, so we can get rid of the symlinks
     for d in                            \
         "${CT_PREFIX_DIR}"              \
-        "${CT_SYSROOT_DIR}"             \
-        "${CT_SYSROOT_DIR}/usr"         \
         "${CT_PREFIX_DIR}/${CT_TARGET}" \
     ; do
         CT_DoExecLog ALL rm -f "${d}/lib32"

Go to that directory and apply the patch :

cd /home/user/crosstool/lib/ct-ng-yourcrosstoolversion/scripts/build
patch < important.patch

Creating a cross compiler toolchain for ppc64

Download graf_chokolo's kernel :

cd /home/user/kernel
git clone git://git.gitbrew.org/ps3/ps3linux/linux-2.6.git
tar -zcvf linux-2.6.tar.gz linux-2.6/

Copy the sample configuration file and modify it :

cp /home/user/crosstool/lib/ct-ng-yourcrosstoolversion/samples/powerpc64-unknown-linux-gnu/* /home/user/toolchain/powerpc/
cd /home/user/toolchain/powerpc/
mv crosstool.config .config
cd /home/user/toolchain/powerpc/
ct-ng menuconfig

I've added graf_chokolos kernel :

  • Operating System -> Linux Kernel version -> custom tarball
  • Operating System -> Path to custom tarball -> /home/user/kernel/linux-2.6.tar.gz

or


Start from scratch and configure the toolchain the way you want :

cd /home/user/toolchain/powerppc/
ct-ng menuconfig

Compile ppc64 toolchain :

unset LD_LIBRARY_PATH LIBRARY_PATH CPATH
export LD_LIBRARY_PATH LIBRARY_PATH CPATH
ct-ng build.#number

Wait for some time until it finishes compiling


Testing if your toolchain works properly

export PATH="${PATH}:/home/user/x-tools/powerpc64-unknown-linux-gnu/bin/"
powerpc64-unknown-linux-gnuspe-gcc test.c -o test

More info: http://www.ibm.com/developerworks/linux/tutorials/l-embedded-distro/section3.html

Cross compiling openssl

Download openssl sources

wget http://www.openssl.org/source/openssl-0.9.8g.tar.gz

unpack the sources :

tar -zxvf openssl-0.9.8g.tar.gz

Go to openssl source path :

cd openssl-0.9.8g/

Change the following lines in the Makefile :

INSTALLTOP= /home/user/x-tools/powerpc64-unknown-linux-gnu/powerpc64-unknown-linux-gnu/sysroot/usr
OPENSSLDIR= /home/user/x-tools/powerpc64-unknown-linux-gnu/powerpc64-unknown-linux-gnu/sysroot/usr
CC= powerpc64-unknown-linux-gnu-gcc
AR= powerpc64-unknown-linux-gnu-ar $(ARFLAGS) r
RANLIB= powerpc64-unknown-linux-gnu-ranlib

Finally :

make

Cross compiling graf_chokolo's tools

Make sure you have a working toolchain and openssl installed

Comment the current compiler and add your cross compiler in our case "powerpc64-unknown-linux-gnu-gcc" :

#CC=gcc
CC=powerpc64-unknown-linux-gnu-gcc

Finally :

make

You can find graf_chokolo tools and scripts here :

http://git-hacks.com/linux-ps3

Compiling graf_chokolo's kernel and making a deb package

Go to the directory where you saved your kernel, untar it and go to the kernel source directory :

cd /home/user/kernel
tar xfvz linux-2.6.tar.gz
cd linux-2.6

It is a good measure to clean the source directory :

make clean
make-kpkg clean

Export set ARCH=powerpc And set the right number of concurrent jobs to be done this is used to improve the building time :

export ARCH=powerpc
export CONCURRENCY_LEVEL=4


Use graf_chokolo config file :

cp ps3_linux_config .config
make oldconfig

You can customize your by using make menuconfig.

Now lets compile and package our kernel :

make-kpkg --arch=powerpc --cross-compile=powerpc64-unknown-linux-gnu- --rootcmd=fakeroot --initrd --append-to-version=-graf kernel_image kernel_source kernel_headers