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] – created beckmanfmips_cross_compiler [2014/06/04 17:52] (current) – simple project added beckmanf
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