uKernel/doc/cross-gcc.md

105 lines
3.1 KiB
Markdown

Cross-compiling with GCC
========================
Some compilers, like GCC, need to be built for a specific platform in order to
compile code suitable there. This document gathers the different steps required
for this purpose. Three major steps are required:
* install the dependencies
* compile binutils
* compile GCC
Dependencies
------------
Binutils and GCC require the following software components to be available in
the system prior to their installation:
| Component | Notes |
| --------- | ----------------------- |
| Make | eg GNU Make or BSD Make |
| Bison | |
| Flex | |
| GMP | |
| MPC | |
| MPFR | |
| Texinfo | |
Please refer to the manual of your local system for information on how to find
and install these components as required.
Binutils
--------
Download the latest version of binutils; at the time of writing this document it
is version 2.32:
$ wget https://ftpmirror.gnu.org/binutils/binutils-2.32.tar.gz
To configure binutils it is necessary to choose a target. It can be chosen
according to the following table:
| Port | Target |
| ----- | --------- |
| amd64 | amd64-elf |
| i386 | i686-elf |
Modify the environment to reflect this choice; in this case for the i386 port:
$ TARGET="i686-elf"
$ PREFIX="$HOME/opt/cross-gcc-$TARGET"
$ PATH="$PREFIX/bin:$PATH"
Extract, configure, and build binutils in a dedicated tree:
$ tar xzf binutils-2.32.tar.gz
$ mkdir binutils-build
$ (cd binutils-build && ../binutils-2.32/configure --target="$TARGET" \
--prefix="$PREFIX" --with-sysroot --disable-nls --disable-werror)
$ (cd binutils-build && make)
$ (cd binutils-build && make install)
GCC
---
Download the latest version of GCC; at the time of writing this document it is
version 8.3.0:
$ wget https://ftpmirror.gnu.org/gcc/gcc-8.3.0/gcc-8.3.0.tar.gz
Just the same, GCC has to be configured for the target chosen.
*Note:* GNU Make is required to build GCC.
Extract, configure, and build GCC in a dedicated tree:
$ tar xzf gcc-8.3.0.tar.gz
$ mkdir gcc-build
$ (cd gcc-build && ../gcc-8.3.0/configure --target="$TARGET" \
--prefix="$PREFIX" --disable-nls --enable-languages=c,c++ \
--without-headers
$ (cd gcc-build && make all-gcc)
$ (cd gcc-build && make all-target-libgcc)
$ (cd gcc-build && make install-gcc)
$ (cd gcc-build && make install-target-libgcc)
Using the cross-compiler
------------------------
Make sure the compiler binaries are available in your PATH:
$ export TARGET="i686-elf"
$ export PATH="$HOME/opt/cross-gcc-$TARGET/bin:$PATH"
The compiler can then be used directly. For instance, its version can be
obtained by invoking the following:
$ $TARGET-gcc --version
Troubleshooting
---------------
In case the combination of binutils and GCC does not build together, it is
possible to refer to the following table and choose a combination known to have
worked before: <https://wiki.osdev.org/Cross-Compiler_Successful_Builds>