Editing Cross Compiling

Jump to navigation Jump to search
Warning: You are not logged in. Your IP address will be publicly visible if you make any edits. If you log in or create an account, your edits will be attributed to your username, along with other benefits.

The edit can be undone. Please check the comparison below to verify that this is what you want to do, and then publish the changes below to finish undoing the edit.

Latest revision Your text
Line 1: Line 1:
[[Category:OtherOS]]
=Cross Compiling=
=Cross Compiling=


This page shows how to cross compile for CellBE/ppc64
This page shows how to cross compile for cellBE/ppc


Install required packages
<pre>
sudo apt-get install build-essential gawk bison flex automake libtool cvs lzma ncurses-dev
sudo apt-get install texinfo patch g++ gcj
</pre>


== Gentoo ==
Create directories and compile crosstool
 
<pre>
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 :
 
{{keyboard|content=<syntaxhighlight lang="bash">grep -c '^processor' /proc/cpuinfo</syntaxhighlight>}}
 
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 :
 
{{keyboard|content=<syntaxhighlight lang="bash">
ct-ng build.4
CONCURRENCY_LEVEL=4
</syntaxhighlight>}}
 
 
===Installing Cross Tool===
 
Install required packages :
{{keyboard|content=<syntaxhighlight lang="bash">sudo apt-get install build-essential gawk bison flex automake libtool cvs lzma ncurses-dev texinfo patch g++ gcj mercurial git-core</syntaxhighlight>}}
 
Add the enviromental variable to bash :
{{keyboard|content=<syntaxhighlight lang="bash">sudo vi /etc/bash.bashrc</syntaxhighlight>}}
or
{{keyboard|content=<syntaxhighlight lang="bash">vi /home/user/.bashrc</syntaxhighlight>}}
 
 
Add the following lines at the end of the file :
 
{{keyboard|content=<syntaxhighlight lang="bash">
export PATH="${PATH}:/home/user/crosstool/bin/"
export PATH="${PATH}:/home/user/x-tools/powerpc64-unknown-linux-gnu/bin/"
export CONCURRENCY_LEVEL=#number
</syntaxhighlight>}}
 
 
Create directories and compile crosstool :
 
{{keyboard|content=<syntaxhighlight lang="bash">
mkdir /home/user/crosstool
mkdir /home/user/crosstool
mkdir /home/user/kernel
mkdir /home/user/kernel
mkdir -p /home/user/toolchain/powerpc
mkdir -p /home/user/toolchain/mips
hg clone http://crosstool-ng.org/hg/crosstool-ng
tar xvjf crosstool-ng-1.10.0.tar.bz2
cd crosstool-ng
cd crosstool-ng-1.10.0/
./configure --prefix=/home/user/crosstool
./configure --prefix=/home/user/crosstool/
make && make install
make && make install
</syntaxhighlight>}}
</pre>
 
* /home/user/crosstool-ng/ -> '''crosstool-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====
* /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""


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


<pre>
<pre>
diff --git a/scripts/build/internals.sh b/scripts/build/internals.sh
sudo gedit /etc/bash.bashrc
--- 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"
</pre>
</pre>


Go to that directory and apply the patch :
Add the following line at the end of the file


{{keyboard|content=<syntaxhighlight lang="bash">
"export PATH="${PATH}:/home/user/crosstool/bin/"
cd /home/user/crosstool/lib/ct-ng-yourcrosstoolversion/scripts/build
patch < important.patch
</syntaxhighlight>}}


===Creating a cross compiler toolchain for ppc64===


Download graf_chokolo's kernel :
Download graf_chokolo's kernel


{{keyboard|content=<syntaxhighlight lang="bash">
<pre>
cd /home/user/kernel
cd /home/user/kernel
git clone git://git.gitbrew.org/ps3/ps3linux/linux-2.6.git
wget -O linux-2.6.tar.gz http://git.dukio.com/gitweb.cgi?p=linux-2.6\;a=snapshot\;h=HEAD\;sf=tgz
tar -zcvf linux-2.6.tar.gz linux-2.6/
</pre>
</syntaxhighlight>}}


Copy the sample configuration file and modify it :
Copy the configuration file and modify it


{{keyboard|content=<syntaxhighlight lang="bash">
<pre>
cp /home/user/crosstool/lib/ct-ng-yourcrosstoolversion/samples/powerpc64-unknown-linux-gnu/* /home/user/toolchain/powerpc/
cp /home/user/crosstool/lib/ct-ng-1.10.0/samples/powerpc64-unknown-linux-gnu/* /home/user/toolchain/powerppc/
cd /home/user/toolchain/powerpc/
mv crosstool.config .config
mv crosstool.config .config
cd /home/user/toolchain/powerpc/
cd /home/user/toolchain/powerppc/
ct-ng menuconfig
ct-ng menuconfig
</syntaxhighlight>}}
<pre>


I've added graf_chokolos kernel :
I added graf_chokolos kernell


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


'''or'''
=or=
----


Start from scratch and configure the toolchain the way you want :
Configure the toolchain the way you want  
 
<pre>
{{keyboard|content=<syntaxhighlight lang="bash">
cd /home/user/toolchain/powerppc/
cd /home/user/toolchain/powerppc/
ct-ng menuconfig
ct-ng menuconfig
</syntaxhighlight>}}
Compile ppc64 toolchain :
{{keyboard|content=<syntaxhighlight lang="bash">
unset LD_LIBRARY_PATH LIBRARY_PATH CPATH
export LD_LIBRARY_PATH LIBRARY_PATH CPATH
ct-ng build.#number
</syntaxhighlight>}}
'''Wait for some time until it finishes compiling'''
----
===Testing if your toolchain works properly===
{{keyboard|content=<syntaxhighlight lang="bash">
export PATH="${PATH}:/home/user/x-tools/powerpc64-unknown-linux-gnu/bin/"
powerpc64-unknown-linux-gnuspe-gcc test.c -o test
</syntaxhighlight>}}
More info: http://www.ibm.com/developerworks/linux/tutorials/l-embedded-distro/section3.html
===Cross compiling openssl===
Download openssl sources
{{keyboard|content=<syntaxhighlight lang="bash">wget http://www.openssl.org/source/openssl-0.9.8g.tar.gz</syntaxhighlight>}}
unpack the sources :
{{keyboard|content=<syntaxhighlight lang="bash">tar -zxvf openssl-0.9.8g.tar.gz</syntaxhighlight>}}
Go to openssl source path :
{{keyboard|content=<syntaxhighlight lang="bash">cd openssl-0.9.8g/</syntaxhighlight>}}
Change the following lines in the Makefile :
<pre>
<pre>
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
</pre>
Finally :
{{keyboard|content=<syntaxhighlight lang="bash">make</syntaxhighlight>}}
===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" :
<pre>
#CC=gcc
CC=powerpc64-unknown-linux-gnu-gcc
</pre>
Finally :
{{keyboard|content=<syntaxhighlight lang="bash">make</syntaxhighlight>}}
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 :
{{keyboard|content=<syntaxhighlight lang="bash">
cd /home/user/kernel
tar xfvz linux-2.6.tar.gz
cd linux-2.6
</syntaxhighlight>}}
It is a good measure to clean the source directory :
{{keyboard|content=<syntaxhighlight lang="bash">
make clean
make-kpkg clean
</syntaxhighlight>}}
Export set ARCH=powerpc
And set the right number of concurrent jobs to be done this is used to improve the building time :
{{keyboard|content=<syntaxhighlight lang="bash">
export ARCH=powerpc
export CONCURRENCY_LEVEL=4
</syntaxhighlight>}}
Use graf_chokolo config file :
{{keyboard|content=<syntaxhighlight lang="bash">
cp ps3_linux_config .config
make oldconfig
</syntaxhighlight>}}
You can customize your by using make menuconfig.
Now lets compile and package our kernel :
{{keyboard|content=<syntaxhighlight lang="bash">make-kpkg --arch=powerpc --cross-compile=powerpc64-unknown-linux-gnu- --rootcmd=fakeroot --initrd --append-to-version=-graf kernel_image kernel_source kernel_headers</syntaxhighlight>}}
{{Linux}}<noinclude>[[Category:Main]]</noinclude>
Please note that all contributions to PS3 Developer wiki are considered to be released under the GNU Free Documentation License 1.2 (see PS3 Developer wiki:Copyrights for details). If you do not want your writing to be edited mercilessly and redistributed at will, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource. Do not submit copyrighted work without permission!

To protect the wiki against automated edit spam, we kindly ask you to solve the following hCaptcha:

Cancel Editing help (opens in new window)