Sources
- https://wiki.osdev.org/Bare_Bones
- https://wiki.osdev.org/GCC_Cross-Compiler
- https://stackoverflow.com/questions/33450401/building-gcc-make-all-error-2/44910790#44910790
Introduction
The cross compiler will use the System V ABI (Application Binary Interface). An ABI defines how to machine language programs interface with each other. In this case the kernel and applications that will run on it. Also you can write libraries for your operating system which you can compile applications against. The library and the applications using the libraries have to be able to talk to each other. The ABI defines amongst other things how parameters to a function are put into registers and onto the stack. It that interface is defined, two applications adhering to the interface can talk to each other.
Switching to a certain version of GCC via the alternatives system
I compiled the sources of gcc-4.9.2 on Ubuntu 19.04 after installing and changing the alternatives to gcc-6 as outlined in https://askubuntu.com/questions/26498/how-to-choose-the-default-gcc-and-g-version and applying the patch from https://gcc.gnu.org/git/?p=gcc.git;a=commitdiff;h=ec1cc0263f156f70693a62cf17b254a0029f4852
setterm -linewrap off sudo apt-get install gcc-6 g++-6 sudo apt install libc6-dev dpkg -l | grep gcc | awk '{print $2}' sudo update-alternatives --remove-all gcc sudo update-alternatives --remove-all g++ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-6 10 sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-6 10 sudo update-alternatives --install /usr/bin/cc cc /usr/bin/gcc 30 sudo update-alternatives --set cc /usr/bin/gcc sudo update-alternatives --install /usr/bin/c++ c++ /usr/bin/g++ 30 sudo update-alternatives --set c++ /usr/bin/g++ sudo update-alternatives --config gcc sudo update-alternatives --config g++ export CC=/usr/bin/gcc export LD=/usr/bin/ld
You have to apply this patch!!!!! https://gcc.gnu.org/git/?p=gcc.git;a=commitdiff;h=ec1cc0263f156f70693a62cf17b254a0029f4852
Installing the prerequisits
According to https://packages.ubuntu.com/search?keywords=libcloog-isl-dev the libcloog-isl-dev package is not part of the ubuntu 19.04 disco dingo release and it is not advised to install packages from older releases. cloog is optional anyways so it is not used in this explanation.
sudo apt-get update sudo apt-get install build-essential flex bison libgmp3-dev libmpc-dev libmpfr-dev texinfo
Install and build:
#################################### echo Stage 1 - Building Dependencies #################################### setterm -linewrap off # make a working directory cd $HOME/dev rm -rf cross mkdir cross cd cross # install or update all apt-get dependencies sudo apt-get update sudo apt-get upgrade sudo apt-get install gcc # not cross sudo apt-get install g++ sudo apt-get install make sudo apt-get install bison sudo apt-get install flex sudo apt-get install gawk sudo apt-get install libgmp3-dev sudo apt-get install libmpfr-dev libmpfr-doc #sudo apt-get install libmpfr4 libmpfr4-dbg sudo apt-get install mpc sudo apt-get install libmpc-dev sudo apt-get install texinfo # optional #sudo apt-get install libcloog-isl-dev # optional sudo apt-get install build-essential sudo apt-get install glibc-devel sudo apt-get -y install gcc-multilib libc6-i386 # download and unpack necessary files wget http://ftpmirror.gnu.org/binutils/binutils-2.25.1.tar.gz wget http://ftpmirror.gnu.org/gcc/gcc-5.3.0/gcc-5.3.0.tar.gz wget http://ftpmirror.gnu.org/gcc/gcc-4.9.2/gcc-4.9.2.tar.gz wget http://ftpmirror.gnu.org/gcc/gcc-4.9.0/gcc-4.9.0.tar.gz wget http://ftpmirror.gnu.org/gcc/gcc-4.8.3/gcc-4.8.3.tar.gz wget http://ftpmirror.gnu.org/mpc/mpc-1.0.3.tar.gz # unzip all archives #for f in *.tar*; do tar zvxf $f; done rm -rf binutils-2.25.1 tar zvxf binutils-2.25.1.tar.gz rm -rf gcc-4.8.3 tar zvxf gcc-4.8.3.tar.gz rm -rf gcc-4.9.2 tar zvxf gcc-4.9.2.tar.gz # create installation directory cd $HOME/dev/cross mkdir install export PREFIX="$HOME/dev/cross/install" #export TARGET=i686-elf export TARGET=i386-elf export PATH="$PREFIX/bin:$PATH" ################################ echo Stage 2 - Building Compiler ################################ ## install mpc #cd $HOME/dev/cross #mkdir build-mpc #cd build-mpc #../mpc-1.0.3/configure --prefix="$PREFIX" #make -j2 #make -j2 check #make -j2 install #cd .. # install binutils cd $HOME/dev/cross rm -rf build-binutils mkdir build-binutils cd build-binutils ../binutils-2.25.1/configure --target=$TARGET --prefix="$PREFIX" --with-sysroot --disable-nls --disable-werror make -j2 make -j2 install cd .. # install gcc cd $HOME/dev/cross rm -rf build-gcc mkdir build-gcc cd build-gcc #../gcc-4.8.3/configure --target=$TARGET --prefix="$PREFIX" --disable-nls --enable-languages=c,c++ --without-headers --with-mpc="$PREFIX" #../gcc-4.8.3/configure --target=$TARGET --prefix="$PREFIX" --disable-nls --enable-languages=c,c++ --without-headers ../gcc-4.9.2/configure --target=$TARGET --prefix="$PREFIX" --disable-nls --enable-languages=c,c++ --without-headers make -j2 all-gcc make -j2 all-target-libgcc make -j2 install-gcc make -j2 install-target-libgcc
Build Errors:
../../mpc-1.0.3/src/mul.c:175:1: error: conflicting types for ‘mpfr_fmma’
cfns.gperf:101:1: error: ‘const char* libc_name_p(const char*, unsigned int)’ redeclared inline with ‘gnu_inline’ attribute
The cross compilers are in
~/dev/cross/install/bin