Cross Compiling: Difference between revisions

From PS3 Developer wiki
Jump to navigation Jump to search
(added a patch to compile correctly without further modifications)
mNo edit summary
 
(10 intermediate revisions by 4 users not shown)
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/ppc64




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


== Ubuntu/Debian ==
== 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===
===Installing Cross Tool===


Install required packages
Install required packages :
<pre>
{{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>}}
sudo apt-get install build-essential gawk bison flex automake libtool cvs lzma ncurses-dev texinfo patch g++ gcj
 
</pre>
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 :


Create directories and compile crosstool
{{keyboard|content=<syntaxhighlight lang="bash">
<pre>
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/powerpc
tar xvjf crosstool-ng-1.10.0.tar.bz2
hg clone http://crosstool-ng.org/hg/crosstool-ng
cd crosstool-ng-1.10.0/
cd crosstool-ng
./configure --prefix=/home/user/crosstool/
./configure --prefix=/home/user/crosstool
make && make install
make && make install
</pre>
</syntaxhighlight>}}


* /home/user/crosstool-ng-1.10.0/ -> '''crostool-ng sources'''
* /home/user/crosstool-ng/ -> '''crosstool-ng sources'''
* /home/user/crosstool/ -> '''Crosstool install directory with binaries'''
* /home/user/crosstool/ -> '''Crosstool install directory with binaries'''
* /home/user/toolchain/ -> '''Directory where the binary will be installed'''
* /home/user/toolchain/ -> '''Directory where the binary will be installed'''
Line 37: Line 69:
* /home/user/kernel -> '''Place were graf_chokolo's linux kernel tarball will be saved'''
* /home/user/kernel -> '''Place were graf_chokolo's linux kernel tarball will be saved'''


Add the enviromental variable to bash
===Patching crosstool===
 
<pre>
sudo gedit /etc/bash.bashrc
</pre>
 
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===
NOTE : MAYBE THIS PATCHING STEP IS USELESS WITH LASTEST CROSSTOOL-NG REVISION


For some reason, the compiler removes the symbolic links for lib64
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
The following patch corrects this behaviour allowing the toolchain to work properly without further modifications.


====Required Patch====
====Required Patch====


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


<pre>
<pre>
Line 73: Line 96:
</pre>
</pre>


Go to that directory and apply the patch
Go to that directory and apply the patch :


<pre>
{{keyboard|content=<syntaxhighlight lang="bash">
cd /home/usr/crosstool/lib/ct-ng-1.10.0/scripts/build
cd /home/user/crosstool/lib/ct-ng-yourcrosstoolversion/scripts/build
patch < important.patch
patch < important.patch
</pre>
</syntaxhighlight>}}


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


Download graf_chokolo's kernel
Download graf_chokolo's kernel :


<pre>
{{keyboard|content=<syntaxhighlight lang="bash">
cd /home/user/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
git clone git://git.gitbrew.org/ps3/ps3linux/linux-2.6.git
</pre>
tar -zcvf linux-2.6.tar.gz linux-2.6/
</syntaxhighlight>}}


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


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


I've added graf_chokolos kernel  
I've added graf_chokolos kernel :


*Operating System -> Linux Kernel version -> custom tarball
*Operating System -> Linux Kernel version -> custom tarball
Line 107: Line 131:
----
----


Start from scratch and configure the toolchain the way you want  
Start from scratch and 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
</pre>
</syntaxhighlight>}}


Compile ppc64 toolchain
Compile ppc64 toolchain :


<pre>
{{keyboard|content=<syntaxhighlight lang="bash">
unset LD_LIBRARY_PATH LIBRARY_PATH CPATH
unset LD_LIBRARY_PATH LIBRARY_PATH CPATH
export LD_LIBRARY_PATH LIBRARY_PATH CPATH
export LD_LIBRARY_PATH LIBRARY_PATH CPATH
ct-ng build
ct-ng build.#number
</pre>
</syntaxhighlight>}}


'''Wait for some time until it finishes compiling'''
'''Wait for some time until it finishes compiling'''
Line 125: Line 150:


===Testing if your toolchain works properly===
===Testing if your toolchain works properly===
<pre>
 
{{keyboard|content=<syntaxhighlight lang="bash">
export PATH="${PATH}:/home/user/x-tools/powerpc64-unknown-linux-gnu/bin/"
export PATH="${PATH}:/home/user/x-tools/powerpc64-unknown-linux-gnu/bin/"
powerpc64-unknown-linux-gnuspe-gcc test.c -o test
powerpc64-unknown-linux-gnuspe-gcc test.c -o test
</pre>
</syntaxhighlight>}}


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


Download openssl sources
Download openssl sources
<pre>
{{keyboard|content=<syntaxhighlight lang="bash">wget http://www.openssl.org/source/openssl-0.9.8g.tar.gz</syntaxhighlight>}}
wget http://www.openssl.org/source/openssl-0.9.8g.tar.gz
</pre>


unpack the sources
unpack the sources :
<pre>
{{keyboard|content=<syntaxhighlight lang="bash">tar -zxvf openssl-0.9.8g.tar.gz</syntaxhighlight>}}
tar xvjf openssl-0.9.8g.tar.gz
</pre>


Go to openssl source path
Go to openssl source path :
<pre>
{{keyboard|content=<syntaxhighlight lang="bash">cd openssl-0.9.8g/</syntaxhighlight>}}
cd openssl-0.9.8g/
</pre>


Change the following lines in the Makefile
Change the following lines in the Makefile :


<pre>
<pre>
INSTALLTOP=/x-tools/powerpc64-unknown-linux-gnu/powerpc64-unknown-linux-gnu/sysroot/usr
INSTALLTOP= /home/user/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
OPENSSLDIR= /home/user/x-tools/powerpc64-unknown-linux-gnu/powerpc64-unknown-linux-gnu/sysroot/usr
CC= powerpc64-unknown-linux-gnu-gcc
CC= powerpc64-unknown-linux-gnu-gcc
AR=xpowerpc64-unknown-linux-gnu-ar $(ARFLAGS) r
AR= powerpc64-unknown-linux-gnu-ar $(ARFLAGS) r
RANLIB= powerpc64-unknown-linux-gnu-ranlib
RANLIB= powerpc64-unknown-linux-gnu-ranlib
</pre>
</pre>


Finally  
Finally :
{{keyboard|content=<syntaxhighlight lang="bash">make</syntaxhighlight>}}


<pre>
make
</pre>


===Cross compiling graf_chokolo's tools===
===Cross compiling graf_chokolo's tools===
Make sure you have a working toolchain and openssl installed
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"
Comment the current compiler and add your cross compiler in our case "powerpc64-unknown-linux-gnu-gcc" :


<pre>
<pre>
Line 175: Line 194:
</pre>
</pre>


finally
Finally :
<pre>
 
make
{{keyboard|content=<syntaxhighlight lang="bash">make</syntaxhighlight>}}
</pre>
 
you can find graf_chokolo tools and scripts here
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>}}


http://git.dukio.com/gitweb.cgi
You can customize your by using make menuconfig.


===Compiling graf_chokolo's kernel===
Now lets compile and package our kernel :


Set the following environmental variables
{{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>}}


If you haven't already
<pre>
export
</pre>


the cross compile environmental variables
<pre>
CROSS_COMPILE=powerpc64-unknown-linux-gnu-
ARCH=powerpc
</pre>


Finally


<pre>
{{Linux}}<noinclude>[[Category:Main]]</noinclude>
make
</pre>

Latest revision as of 17:57, 15 September 2021

Cross Compiling[edit | edit source]

This page shows how to cross compile for CellBE/ppc64


Gentoo[edit | edit source]

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[edit | edit source]

Know your host System[edit | edit source]

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 :

Type This
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 :

Type This
ct-ng build.4
CONCURRENCY_LEVEL=4


Installing Cross Tool[edit | edit source]

Install required packages :

Type This
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 :

Type This
sudo vi /etc/bash.bashrc

or

Type This
vi /home/user/.bashrc


Add the following lines at the end of the file :

Type This
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 :

Type This
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/ -> 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[edit | edit source]

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[edit | edit source]

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 :

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

Creating a cross compiler toolchain for ppc64[edit | edit source]

Download graf_chokolo's kernel :

Type This
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 :

Type This
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 :

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

Compile ppc64 toolchain :

Type This
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[edit | edit source]

Type This
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[edit | edit source]

Download openssl sources

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

unpack the sources :

Type This
tar -zxvf openssl-0.9.8g.tar.gz

Go to openssl source path :

Type This
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 :

Type This
make


Cross compiling graf_chokolo's tools[edit | edit source]

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 :

Type This
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[edit | edit source]

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

Type This
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 :

Type This
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 :

Type This
export ARCH=powerpc
export CONCURRENCY_LEVEL=4

Use graf_chokolo config file :

Type This
cp ps3_linux_config .config
make oldconfig

You can customize your by using make menuconfig.

Now lets compile and package our kernel :

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