From 32355dbc285f67e717abd70cbf78ba256a894904 Mon Sep 17 00:00:00 2001 From: Carlos Fenollosa Date: Wed, 15 Oct 2014 11:19:16 +0200 Subject: [PATCH] lesson 11, cross-compiler --- 11-kernel-crosscompiler/README.md | 76 +++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 11-kernel-crosscompiler/README.md diff --git a/11-kernel-crosscompiler/README.md b/11-kernel-crosscompiler/README.md new file mode 100644 index 0000000..4b98108 --- /dev/null +++ b/11-kernel-crosscompiler/README.md @@ -0,0 +1,76 @@ +*Concepts you may want to Google beforehand: cross-compiler* + +**Goal: Create a development environment to build your kernel** + +If you're using a Mac, you will need to do this process right away. Otherwise, it could have waited +for a few more lessons. Anyway, you will need a cross-compiler one we jump to developing in a higher +language, that is, C. [Read why](http://wiki.osdev.org/Why_do_I_need_a_Cross_Compiler%3F) + +I'll be adapting the instructions [at the OSDev wiki](http://wiki.osdev.org/GCC_Cross-Compiler). + + +Required packages +----------------- + +First, install the required packages. On linux, use your package distribution. On a Mac, [install brew](http://brew.sh/) if +you didn't do it on lesson 00, and get those packages with `brew install` + +- gmp +- mpfr +- libmpc +- gcc + +Yes, we will need `gcc` to build our cross-compiled `gcc`, especially on a Mac where gcc has been deprecated for `clang` + +Once installed, find where your packaged gcc is (remember, not clang) and export it. For example: + +``` +export CC=/usr/local/bin/gcc-4.9 +export LD=/usr/local/bin/gcc-4.9 +``` + +We will need to build binutils and a cross-compiled gcc, and we will put them into `/usr/local/i386elfgcc`, so +let's export some paths now. Feel free to change them to your liking. + +``` +export PREFIX="/usr/local/i386elfgcc" +export TARGET=i386-elf +export PATH="$PREFIX/bin:$PATH" +``` + +binutils +-------- + +Rember: always be careful before pasting walls of text from the internet. I recommend copying line by line. + +```sh +mkdir /tmp/src +cd /tmp/src +curl -O http://ftp.gnu.org/gnu/binutils/binutils-2.24.tar.gz # If the link 404's, look for a more recent version +tar xf binutils-2.24.tar.gz +mkdir binutils-build +cd binutils-build +../binutils-2.24/configure --target=$TARGET --enable-interwork --enable-multilib --disable-nls --disable-werror --prefix=$PREFIX 2>&1 | tee configure.log +make all install 2>&1 | tee make.log +``` + +gcc +--- +```sh +cd /tmp/src +curl -O http://mirror.bbln.org/gcc/releases/gcc-4.9.1/gcc-4.9.1.tar.bz2 +tar xf gcc-4.9.1.tar.bz2 +mkdir gcc-build +cd gcc-build +../gcc-4.9.1/configure --target=$TARGET --prefix="$PREFIX" --disable-nls --disable-libssp --enable-languages=c --without-headers +make all-gcc +make all-target-libgcc +make install-gcc +make install-target-libgcc +``` + +That's it! You should have all the GNU binutils and the compiler at `/usr/local/i386elfgcc/bin`, prefixed by `i386-elf-` to avoid +collisions with your system's compiler and binutils. + +You may want to add the `$PATH` to your `.bashrc`. From now on, on this tutorial, we will explicitly use the prefixes when using +the cross-compiled gcc.