Cross-compiling for PowerPC

Cross-compiling PowerPC

There are a lot of different variants of the PowerPC architectures out there. This is what worked for me when cross compiling for the Freescale P2041 processor. The P2041 contains four e500mc cores. e500mc cores are not the same thing as e500v2. My test platform was the Freescale P2041RDB development board. The development board is running a custom port of Linux. My host platform is a virtual machine running Ubuntu 14.04.2 LTS.

Cross compile tool chain

The cross compile tool chain that I used was version 5.5.3 of the ELDK tool kit. When downloading the tool kit you need eldk-5.5.3-powerpc.iso. When I installed the tool kit I used the command line

./install -r "lsb-dev" powerpc

libsodium

The ELDK tool kit does not come with a pre-compiled version of libsodim and you have to build your own. Download libsodium from libsodium. I used libsodium-1.0.3.tar.gz. Extract libsodium to a local directory. I used the following command line to build the library.

# Setup environment variables for cross compiling
source /opt/eldk-5.5.3/powerpc/environment-setup-powerpc-linux

./configure \
--host=powerpc-linux \
 --prefix=/opt/eldk-5.5.3/powerpc/sysroots/powerpc-linux

make

# must execute in a root shell
make install

This places the compiled library files in a directory /opt/eldk-5.5.3/powerpc/sysroots/powerpc-linux The actual location is going to vary based upon the cross compile tool chain that you use. The make install command must be executed from a root shell if you are using Ubuntu as your host machine. When I used "sudo make install" the install failed. To start a root shell execute the command

sudo gnome-terminal

zeromq

Download the source for zeromq. I used zeromq-4.1.2.tar.gz. Extract to a local directory. I used the following command line to build the library

# Setup environment variables for cross compiling
source /opt/eldk-5.5.3/powerpc/environment-setup-powerpc-linux

./configure \
 --host=powerpc-linux \
 --prefix=/opt/eldk-5.5.3/powerpc/sysroots/powerpc-linux \
 PKG_CONFIG_PATH=/opt/eldk-5.5.3/powerpc/sysroots/powerpc-linux/lib/pkgconfig \
 CPPFLAGS=-I/opt/eldk-5.5.3/powerpc/sysroots/powerpc-linux/include \
 LDFLAGS=-L/opt/eldk-5.5.3/powerpc/sysroots/powerpc-linux/lib

make

# must execute from root shell, see previous note
make install

Build Example

I built the examples with the following command line

# Setup environment variables for cross compiling
source /opt/eldk-5.5.3/powerpc/environment-setup-powerpc-linux

# build client
powerpc-linux-gcc /home/chen2/work/zeromq/examples/C/hwclient.c      \
-o /home/chen2/work/chassisStaging/hwclient   \
-I/opt/eldk-5.5.3/powerpc/sysroots/powerpc-linux/include \
 -lzmq -lsodium

# build server
powerpc-linux-gcc /home/chen2/work/zeromq/examples/C/hwserver.c      \
-o /home/chen2/work/chassisStaging/hwserver   \
-I/opt/eldk-5.5.3/powerpc/sysroots/powerpc-linux/include \
 -lzmq -lsodium

Running Example

I copied the sodium and zeromq libraries to /lib on my target. The list of files that I copied over was

libsodium.a   libsodium.so.13      libzmq.la    libzmq.so.5.0.0
libsodium.la  libsodium.so.13.2.0  libzmq.so    pkgconfig
libsodium.so  libzmq.a             libzmq.so.5

I then copied the entire directory chassisStaging, which contained hwserver, hwclient over to my target.

For the server

~/work/chassisStaging$ ./hwserver
Received Hello
Received Hello
Received Hello
Received Hello
Received Hello
Received Hello
Received Hello
Received Hello
Received Hello
Received Hello
^C

For the client

~/work/chassisStaging$ ./client
Connecting to hello world server...
Sending Hello 0...
Received World 0
Sending Hello 1...
Received World 1
Sending Hello 2...
Received World 2
Sending Hello 3...
Received World 3
Sending Hello 4...
Received World 4
Sending Hello 5...
Received World 5
Sending Hello 6...
Received World 6
Sending Hello 7...
Received World 7
Sending Hello 8...
Received World 8
Sending Hello 9...
Received World 9