[[mips_cross_compiler]]

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
mips_cross_compiler [2013/03/29 14:42]
beckmanf created
mips_cross_compiler [2014/06/04 17:52] (current)
beckmanf simple project added
Line 13: Line 13:
   * [[http://​www.gnu.org/​software/​binutils/​|GNU Binutils]]   * [[http://​www.gnu.org/​software/​binutils/​|GNU Binutils]]
   * [[http://​www.gnu.org/​software/​gcc/​|GNU GCC]]   * [[http://​www.gnu.org/​software/​gcc/​|GNU GCC]]
 +  * and others...
 +
 +From a bare ubuntu 12.04 LTS you need to add the following packages:
 +
 +<​code>​
 +sudo apt-get install build-essential m4 texinfo libncurses5-dev bzip2
 +</​code>​
 +
 +
 +Copy the script "​build_mips.sh"​ from below to your home directory. Open a terminal window in ubuntu by starting dash and typing terminal. ​
 +The click terminal which opens the terminal. To change the current directory to your home directory type
 +
 +<​code>​
 +cd
 +</​code>​
 +
 +To see the full path of the current directory:
 +
 +<​code>​
 +pwd
 +</​code>​
 +
 +List the directory contents with 
 +
 +<​code>​
 +ls -la
 +</​code>​
 +
 +Change the file attributes of "​build_mips.sh"​ to executable with
 +
 +<​code>​
 +chmod a+x build_mips.sh
 +</​code>​
 +
 +Look into the bash script with 
 +
 +<​code>​
 +less build_mips.sh
 +</​code>​
 +
 +Extend the search path by appending "​export PATH=$HOME/​site/​bin:​$PATH"​ to your .profile file
 +
 +Log out and login again to make the PATH variable active. Check your PATH variable with
 +
 +<​code>​
 +echo $PATH
 +</​code>​
 +
 +You should see the <​..>/​site/​bin as the first entry. ​
 +
 +Run the build script with
 +
 +<​code>​
 +./​build_mips.sh
 +</​code>​
 +
 +
 +Here is the shell script for building the cross compiler chain. Handmade
 +stuff so you need to adapt. The script will build to a place in your home
 +directory. So first add this place to your PATH variable. ​
 +
 +<code bash build_mips.sh>​
 +#!/bin/bash -ev
 +# -e => exit on error
 +# -v => verbose output
 +
 +# Mips Cross Compiler
 +
 +# Base directory
 +mkdir -p mips
 +# src directory
 +mkdir -p mips/src
 +# build directory
 +mkdir -p mips/build
 +# original archives
 +mkdir -p mips/orig
 +
 +# Set the destination
 +export MYMIPS=${HOME}/​site
 +
 +# Versions
 +GMPVERSION="​4.3.2"​
 +PPLVERSION="​0.12.1"​
 +BINUTILSVERSION="​2.24"​
 +MPFRVERSION="​2.4.2"​
 +MPCVERSION="​1.0.2"​
 +ISLVERSION="​0.12.2"​
 +CLOOGVERSION="​0.18.1"​
 +GCCVERSION="​4.8.2"​
 +NEWLIBVERSION="​1.20.0"​
 +GDBVERSION="​7.5.1"​
 +
 +
 +########################################​
 +# Binutils
 +########################################​
 +
 +# Get the archives
 +cd mips/​orig ​
 +if [ ! -e "​binutils-${BINUTILSVERSION}.tar.bz2"​ ] ; then
 +  wget http://​ftp.gnu.org/​gnu/​binutils/​binutils-${BINUTILSVERSION}.tar.bz2
 +fi
 +
 +# Unpack to source directory
 +cd ../src
 +if [ ! -d "​binutils-${BINUTILSVERSION}"​ ] ; then
 +tar -xvjf ../​orig/​binutils-${BINUTILSVERSION}.tar.bz2
 +fi 
 +
 +cd ../build
 +mkdir -p binutils
 +cd binutils
 +if [ ! -e "​config.status"​ ] ; then
 +../​../​src/​binutils-${BINUTILSVERSION}/​configure --target=mipsel-none-elf \
 +--prefix=$MYMIPS
 +fi
 +
 +if [ ! -e "​${MYMIPS}/​bin/​mipsel-none-elf-ld"​ ] ; then
 +make
 +make install
 +fi
 +cd ../../..
 +
 +########################################​
 +# GMP
 +########################################​
 +
 +# Get the archives
 +cd mips/​orig ​
 +if [ ! -e "​gmp-${GMPVERSION}.tar.bz2"​ ] ; then
 +  wget ftp://​ftp.halifax.rwth-aachen.de/​gnu/​gmp/​gmp-4.3.2.tar.bz2
 +fi
 +
 +# Unpack to source directory
 +cd ../src
 +if [ ! -d "​gmp-${GMPVERSION}"​ ] ; then
 +tar -xjvf ../​orig/​gmp-${GMPVERSION}.tar.bz2
 +fi 
 +
 +# Build
 +cd ../build
 +mkdir -p gmp
 +cd gmp
 +if [ ! -e "​config.status"​ ] ; then
 +../​../​src/​gmp-${GMPVERSION}/​configure --prefix=$MYMIPS --enable-cxx
 +fi
 +if [ ! -e "​${MYMIPS}/​lib/​libgmp.a"​ ] ; then
 +make
 +make install
 +fi
 +cd ../../..
 +
 +
 +########################################​
 +# PPL
 +########################################​
 +
 +# Get the archives
 +#cd mips/​orig ​
 +#if [ ! -e "​ppl-${PPLVERSION}.tar.bz2"​ ] ; then
 +#  wget ftp://​ftp.cs.unipr.it/​pub/​ppl/​releases/​${PPLVERSION}/​ppl-${PPLVERSION}.tar.bz2
 +#fi
 +
 +# Unpack to source directory
 +#cd ../src
 +#if [ ! -d "​ppl-${PPLVERSION}"​ ] ; then
 +#tar -xjvf ../​orig/​ppl-${PPLVERSION}.tar.bz2
 +#fi 
 +
 +#cd ../build
 +#mkdir -p ppl
 +#cd ppl
 +#if [ ! -e "​config.status"​ ] ; then
 +#​../​../​src/​ppl-${PPLVERSION}/​configure --prefix=$MYMIPS --with-gmp=$MYMIPS --with-sysroot=$MYMIPS
 +#fi
 +#if [ ! -e "​${MYMIPS}/​lib/​libppl.a"​ ] ; then
 +#make 
 +#make install
 +#fi
 +#cd ../../..
 +
 +
 +######################################​
 +# MPFR library
 +#######################################​
 +
 +# Get the archives
 +cd mips/​orig ​
 +if [ ! -e "​mpfr-${MPFRVERSION}.tar.bz2"​ ] ; then
 +  wget ftp://​ftp.halifax.rwth-aachen.de/​gnu/​mpfr/​mpfr-${MPFRVERSION}.tar.bz2
 +fi
 +
 +# Unpack to source directory
 +cd ../src
 +if [ ! -d "​mpfr-${MPFRVERSION}"​ ] ; then
 +tar -xvjf ../​orig/​mpfr-${MPFRVERSION}.tar.bz2
 +fi
 +
 +cd ../build
 +mkdir -p mpfr
 +cd mpfr
 +if [ ! -e "​config.status"​ ] ; then
 +../​../​src/​mpfr-${MPFRVERSION}/​configure --prefix=$MYMIPS --with-gmp=$MYMIPS ​
 +fi
 +
 +if [ ! -e "​${MYMIPS}/​lib/​libmpfr.a"​ ] ; then
 +make
 +make install
 +fi
 +cd ../​../​.. ​
 +
 +######################################​
 +# MPC library
 +#######################################​
 +
 +# Get the archives
 +cd mips/​orig ​
 +if [ ! -e "​mpc-${MPCVERSION}.tar.gz"​ ] ; then
 +  wget ftp://​ftp.halifax.rwth-aachen.de/​gnu/​mpc/​mpc-${MPCVERSION}.tar.gz
 +fi
 +
 +# Unpack to source directory
 +cd ../src
 +if [ ! -d "​mpc-${MPCVERSION}"​ ] ; then
 +tar -xvzf ../​orig/​mpc-${MPCVERSION}.tar.gz
 +fi
 +
 +cd ../build
 +mkdir -p mpc
 +cd mpc
 +if [ ! -e "​config.status"​ ] ; then
 +../​../​src/​mpc-${MPCVERSION}/​configure --prefix=$MYMIPS --with-gmp=$MYMIPS --with-mpfr=$MYMIPS
 +fi
 +
 +if [ ! -e "​${MYMIPS}/​lib/​libmpc.a"​ ] ; then
 +make
 +make install
 +fi
 +cd ../​../​.. ​
 +
 +
 +
 +##############​
 +# ISL
 +##############​
 +
 +# Get the archives
 +cd mips/​orig ​
 +if [ ! -e "​isl-${ISLVERSION}.tar.bz2"​ ] ; then
 +  wget  ftp://​gcc.gnu.org/​pub/​gcc/​infrastructure/​isl-${ISLVERSION}.tar.bz2
 +fi
 +
 +
 +# Unpack to source directory
 +cd ../src
 +if [ ! -d "​isl-${ISLVERSION}"​ ] ; then
 +tar -xvjf ../​orig/​isl-${ISLVERSION}.tar.bz2
 +fi
 +
 +cd ../build
 +mkdir -p isl
 +cd isl
 +if [ ! -e "​config.status"​ ] ; then
 +../​../​src/​isl-${ISLVERSION}/​configure --prefix=$MYMIPS --with-gmp-prefix=$MYMIPS ​
 +fi
 +
 +if [ ! -e "​${MYMIPS}/​lib/​libisl.a"​ ] ; then
 +make
 +make install
 +fi
 +cd ../​../​.. ​
 +
 +##############​
 +# CLOOG
 +##############​
 +
 +# Get the archives
 +cd mips/​orig ​
 +if [ ! -e "​cloog-${CLOOGVERSION}.tar.gz"​ ] ; then
 +  wget  ftp://​gcc.gnu.org/​pub/​gcc/​infrastructure/​cloog-${CLOOGVERSION}.tar.gz
 +fi
 +
 +
 +# Unpack to source directory
 +cd ../src
 +if [ ! -d "​cloog-${CLOOGVERSION}"​ ] ; then
 +tar -xvzf ../​orig/​cloog-${CLOOGVERSION}.tar.gz
 +fi
 +
 +cd ../build
 +mkdir -p cloog
 +cd cloog
 +if [ ! -e "​config.status"​ ] ; then
 +../​../​src/​cloog-${CLOOGVERSION}/​configure --prefix=$MYMIPS --with-gmp-prefix=$MYMIPS --with-isl=system --with-isl-prefix=$MYMIPS
 +fi
 +
 +if [ ! -e "​${MYMIPS}/​lib/​libcloog-isl.a"​ ] ; then
 +make
 +make install
 +fi
 +cd ../​../​.. ​
 +
 +
 +########################################​
 +# newlib
 +########################################​
 +
 +# Get the archives
 +cd mips/orig
 +
 +if [ ! -e "​newlib-${NEWLIBVERSION}.tar.gz"​ ] ; then
 +  wget ftp://​sourceware.org/​pub/​newlib/​newlib-${NEWLIBVERSION}.tar.gz
 +fi
 +
 +# Unpack to source directory
 +cd ../src
 +if [ ! -d "​newlib-${NEWLIBVERSION}"​ ] ; then
 +tar -xvzf ../​orig/​newlib-${NEWLIBVERSION}.tar.gz
 +fi 
 +
 +cd ../..
 +
 +########################################​
 +# gcc first stage
 +########################################​
 +
 +# Get the archives
 +cd mips/​orig ​
 +if [ ! -e "​gcc-${GCCVERSION}.tar.bz2"​ ] ; then
 +  wget ftp://​ftp.halifax.rwth-aachen.de/​gnu/​gcc/​gcc-${GCCVERSION}/​gcc-${GCCVERSION}.tar.bz2
 +fi
 +
 +# Unpack to source directory
 +cd ../src
 +if [ ! -d "​gcc-${GCCVERSION}"​ ] ; then
 +tar -xvjf ../​orig/​gcc-${GCCVERSION}.tar.bz2
 +fi 
 +
 +cd ../build
 +mkdir -p gcc-stage1
 +cd gcc-stage1
 +if [ ! -e "​config.status"​ ] ; then
 +LDFLAGS="​-Wl,​-rpath,​$MYMIPS/​lib"​ \
 +../​../​src/​gcc-${GCCVERSION}/​configure --target=mipsel-none-elf \
 +--prefix=$MYMIPS \
 +--with-gmp=$MYMIPS \
 +--with-mpfr=$MYMIPS \
 +--with-mpc=$MYMIPS \
 +--with-isl=$MYMIPS \
 +--with-newlib --without-headers \
 +--disable-shared --disable-threads --disable-libssp \
 +--disable-libgomp --disable-libmudflap \
 +--enable-languages="​c"  ​
 +fi
 +
 +if [ ! -e "​${MYMIPS}/​bin/​mipsel-none-elf-gcc"​ ] ; then
 +make all-gcc
 +make install-gcc
 +fi
 +cd ../../..
 +
 +########################################​
 +# newlib
 +########################################​
 +
 +# Build
 +cd mips/build
 +mkdir -p newlib
 +cd newlib
 +if [ ! -e "​config.status"​ ] ; then
 +../​../​src/​newlib-${NEWLIBVERSION}/​configure --prefix=$MYMIPS --target=mipsel-none-elf ​
 +fi
 +
 +if [ ! -e "​${MYMIPS}/​mipsel-none-elf/​lib/​libc.a"​ ] ; then
 +make
 +make install
 +fi
 +cd ../​../​.. ​
 +
 +########################################​
 +# gcc second stage
 +########################################​
 +
 +cd mips/build
 +mkdir -p gcc-stage2
 +cd gcc-stage2
 +if [ ! -e "​config.status"​ ] ; then
 +LDFLAGS="​-Wl,​-rpath,​$MYMIPS/​lib"​ \
 +../​../​src/​gcc-${GCCVERSION}/​configure --target=mipsel-none-elf \
 +--prefix=$MYMIPS \
 +--with-gmp=$MYMIPS \
 +--with-mpfr=$MYMIPS \
 +--with-mpc=$MYMIPS \
 +--with-isl=$MYMIPS \
 +--with-newlib ​ \
 +--disable-shared --disable-threads --disable-libssp \
 +--disable-libgomp --disable-libmudflap \
 +--enable-languages="​c,​c++"  ​
 +fi
 +
 +if [ ! -e "​${MYMIPS}/​bin/​mipsel-none-elf-g++"​ ] ; then
 +make all
 +make install
 +fi
 +cd ../../..
 +
 +
 +########################################​
 +# GDB
 +########################################​
 +
 +# Get the archives
 +cd mips/​orig ​
 +if [ ! -e "​gdb-${GDBVERSION}.tar.bz2"​ ] ; then
 +  wget ftp://​ftp.halifax.rwth-aachen.de/​gnu/​gdb/​gdb-${GDBVERSION}.tar.bz2
 +fi
 +
 +# Unpack to source directory
 +cd ../src
 +if [ ! -d "​gdb-${GDBVERSION}"​ ] ; then
 +tar -xvjf ../​orig/​gdb-${GDBVERSION}.tar.bz2
 +fi 
 +
 +cd ../build
 +mkdir -p gdb
 +cd gdb
 +if [ ! -e "​config.status"​ ] ; then
 +../​../​src/​gdb-${GDBVERSION}/​configure --target=mipsel-none-elf ​ \
 +--enable-sim-trace \
 +--enable-sim-stdio \
 +--prefix=$MYMIPS ​
 +fi
 +
 +if [ ! -e "​${MYMIPS}/​bin/​mipsel-none-elf-gdb"​ ] ; then
 +make
 +make install
 +fi
 +cd ../../..
 +
 +</​code>​
 +
 +===== Compile and Run an example =====
 +
 +Here is an example mini c code to test the compiler. ​
 +
 +<code c hello.c>
 +/* Hello world */
 +#include <​stdio.h>​
 +
 +int myfunc(int a, int b){
 +  int k; 
 +  k = a + b; 
 +
 +  k += 7; 
 +  k *= 6; 
 +  return k; 
 +}
 +
 +int main(){
 +  int i,​j,​m;  ​
 +  j = 3;
 +  m = 2;
 +  ​
 +  for(i=0;​i<​5;​i++){
 +    m += myfunc(i,​j);  ​
 +    printf("​m is %d\n",​m);​
 +  }
 +  return 0;
 +}
 +</​code>​
 +
 +Compile to Assembler for viewing
 +
 +<​code>​
 +mipsel-none-elf-gcc -S hello.c
 +</​code>​
 +
 +The output assembler code is in hello.s. ​
 +
 +Compile and link ready for simulation with instruction set simulator
 +
 +<​code>​
 +mipsel-none-elf-gcc -o hello -Tidt.ld hello.c
 +</​code>​
 +
 +Run the code
 +
 +<​code>​
 +mipsel-none-elf-run hello
 +</​code>​
 +
 +=== Analyze ===
 +
 +Produce an annoted source code showing how often lines are executed. ​
 +
 +<​code>​
 +gcc -fprofile-arcs -ftest-coverage -o hello hello.c
 +./hello
 +gcov hello.c
 +</​code>​
 +
 +This produces the file hello.c.gcov showing the annotated source file.  ​
 +
 +=== Tracing in instruction set simulator ===
 +
 +Run with instruction tracing in the simulator
 +
 +<​code>​
 +mipsel-none-elf-gcc -Tidt.ld -o hello hello.c
 +mipsel-none-elf-run --trace-insn=on --trace-file trace hello
 +</​code>​
 +
 +===== Test the compiler =====
 +
 +<​code>​
 +sudo apt-get install dejagnu
 +</​code>​
 +
 +<​code>​
 +cd
 +cd mips/​build/​gcc-stage2
 +make check-gcc RUNTESTFLAGS=--target_board=mips-sim
 +</​code>​
 +
 +===== Install git and download a simple project ​ =====
 +
 +Install git and download a simple project
 +
 +<​code>​
 +sudo apt-get install git
 +cd
 +mkdir projects
 +cd projects
 +git clone https://​git.etech.fh-augsburg.de/​friedrich.beckmann/​myfirst.git
 +</​code>​
 +
 +Now you have the simple project "​myfirst"​ in your directory. ​
 +
 +=== Try the MIPS Cross Compiler ===
 +
 +Change to the src directory and compile the code with the cross compiler. ​
 +
 +<​code>​
 +cd myfirst
 +cd src
 +mipsel-none-elf-gcc -S hello.c
 +less hello.s
 +</​code>​
 +
 +Now you have the compiled assembler code "​hello.s"​. To compile to binary do: 
 +
 +<​code>​
 +mipsel-none-elf-gcc -o hello -Tidt.ld hello.c
 +</​code>​
 +
 +Now you have the binary "​hello"​. You can run the binary in the instruction set simulator with
 +
 +<​code>​
 +mipsel-none-elf-run hello
 +</​code>​
 +
 +This will run the binary with the mips instruction set simulator. You should see "Hello World"​. ​
 +
 +
 +
 +===== Open OCD =====
 +
 +[[dt_openocd]]
 +
 +
  
  
  • mips_cross_compiler.1364564548.txt.gz
  • Last modified: 2013/03/29 14:42
  • by beckmanf