Cross Compiling

From PS3 Developer wiki
Revision as of 07:39, 18 April 2011 by PsiCoLeO (talk | contribs) (Improved the instructions to build the kernel and create a deb pakage)
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)

Ubuntu/Debian

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

<prep> 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

Create directories and compile crosstool

mkdir /home/user/crosstool
mkdir /home/user/kernel
mkdir -p /home/user/toolchain/powerpc
tar xvjf crosstool-ng-1.10.0.tar.bz2
cd crosstool-ng-1.10.0/
./configure --prefix=/home/user/crosstool/
make && make install
  • /home/user/crosstool-ng-1.10.0/ -> 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

Add the enviromental variable to bash

sudo gedit /etc/bash.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/"

Patching crosstool

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/usr/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/usr/crosstool/lib/ct-ng-1.10.0/scripts/build
patch < important.patch

Creating a cross compiler toolchain for ppc64

Download graf_chokolo's kernel

cd /home/user/kernel
wget -O linux-2.6.tar.gz http://git.dukio.com/gitweb.cgi?p=linux-2.6\;a=snapshot\;h=HEAD\;sf=tgz

Copy the sample configuration file and modify it

cp /home/usr/crosstool/lib/ct-ng-1.10.0/samples/powerpc64-unknown-linux-gnu/* /home/usr/toolchain/powerpc/
cd /home/usr/toolchain/powerpc/
mv crosstool.config .config
cd /home/usr/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

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 xvjf openssl-0.9.8g.tar.gz

Go to openssl source path

cd openssl-0.9.8g/

Change the following lines in the Makefile

INSTALLTOP=/x-tools/powerpc64-unknown-linux-gnu/powerpc64-unknown-linux-gnu/sysroot/usr
OPENSSLDIR=/x-tools/powerpc64-unknown-linux-gnu/powerpc64-unknown-linux-gnu/sysroot/usru
CC= powerpc64-unknown-linux-gnu-gcc
AR=xpowerpc64-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.dukio.com/gitweb.cgi

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