[[mips_cross_compiler]]

Differences

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

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
mips_cross_compiler [2013/04/03 11:27]
beckmanf tracing
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...
  
-=== Compile and Run ===+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 Compile to Assembler for viewing
  
-mipsel-none-elf-gcc -S fir.c+<​code>​ 
 +mipsel-none-elf-gcc -S hello.c 
 +</​code>​
  
-The output is fir.s which is the assembler code+The output ​assembler code is in hello.s. 
  
 Compile and link ready for simulation with instruction set simulator Compile and link ready for simulation with instruction set simulator
  
-mipsel-none-elf-gcc -o fir -Tidt.ld ​fir.c+<​code>​ 
 +mipsel-none-elf-gcc -o hello -Tidt.ld ​hello.c 
 +</​code>​
  
 Run the code Run the code
  
-mipsel-none-elf-run ​fir+<​code>​ 
 +mipsel-none-elf-run ​hello 
 +</​code>​
  
 === Analyze === === Analyze ===
  
-Produce an annoted source code +Produce an annoted source code showing how often lines are executed. ​
  
-gcc -fprofile-arcs -ftest-coverage -o fir fir.c+<​code>​ 
 +gcc -fprofile-arcs -ftest-coverage -o hello hello.c 
 +./hello 
 +gcov hello.c 
 +</​code>​
  
-./fir+This produces the file hello.c.gcov showing the annotated source file.  ​
  
-gcov fir.c +=== Tracing in instruction set simulator ===
  
 Run with instruction tracing in the simulator Run with instruction tracing in the simulator
  
-mipsel-none-elf-run --trace-insn=on --trace-file trace fir+<​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.1364981243.txt.gz
  • Last modified: 2013/04/03 11:27
  • by beckmanf