Difference between revisions of "RPi Linaro GCC Compilation"

From eLinux.org
Jump to: navigation, search
(Changed the preferred eglibc for glibc and a hint to link to the libc-version on the Pi)
(Configure system to use new compiler)
 
(One intermediate revision by the same user not shown)
Line 85: Line 85:
 
** C-library:
 
** C-library:
 
*** Set "C library" to "eglibc", or, as eglibc gets deprecated<ref>http://www.eglibc.org/home</ref>, glibc from version 2.19 up.
 
*** Set "C library" to "eglibc", or, as eglibc gets deprecated<ref>http://www.eglibc.org/home</ref>, glibc from version 2.19 up.
*** Set "eglibc version" to "2_13", however, to reduce the size of your executables you could also try to match it with the libc already present on the Pi and select a custom libc-version here, for example the exact commit your libc was build from if you can reveal that.
+
*** Set "eglibc version" to "2_13", however, to reduce the size of your executables you could also try to match it with the libc already present on the Pi and select a custom libc-version here, for example the exact commit your libc was build from if you can reveal that. The major version of libc can be made visible with  
The major version of libc can be made visible with  
 
 
<pre>
 
<pre>
 
ldd  
 
ldd  
Line 111: Line 110:
 
gcc version 4.7.3 20121001 (prerelease) (crosstool-NG 1.17.0)
 
gcc version 4.7.3 20121001 (prerelease) (crosstool-NG 1.17.0)
 
</pre>
 
</pre>
 +
 +
By the way, this manual also works for the newest stable gcc-linaro-5.3-2016.05 at http://releases.linaro.org/components/toolchain/gcc-linaro/5.3-2016.05/
  
 
==References==
 
==References==

Latest revision as of 11:16, 11 August 2016


Back to the Hub.


Software & Distributions:

Software - an overview.

Distributions - operating systems and development environments for the Raspberry Pi.

Kernel Compilation - advice on compiling a kernel.

Performance - measures of the Raspberry Pi's performance.

Programming - programming languages that might be used on the Raspberry Pi.

Overview

This page explains how to build yourself a version of Linaro GCC specifically for building software for the RPi.

From the Linaro website: "Linaro GCC is performance focused branch of the current GCC stable release and includes backports of the improvements and bug fixes that Linaro and others have done upstream" [1]

Requirements

This process should be carried out on the Linux system you wish to compile RPi software on. Therefore, you will require a reasonably powerful computer (preferably 64bit). If you are running on Windows, it is possible to use a linux virtual machine running on Virtualbox. The only software required is crosstool-NG (plus its dependencies).

Procedure

The whole process takes about an hour on a dual-core 2.8GHz 64-bit AMD system using an 8Mbit ADSL connection. NOTE: This procedure was tested on 24th November 2012 using crosstool-ng 1.17.0. It may not be accurate for newer versions of the software.

Install crosstool-NG

tar -xjvf crosstool-ng-1.17.0.tar.bz2
  • Or clone a more recent version from git, I saw this newest version work as well:
git clone https://github.com/crosstool-ng/crosstool-ng.git
cd crosstool-ng
git checkout 1.22
  • Change to the extracted directory, then configure it. You should specify an installation prefix to keep it separate from the OS in case you want to run multiple versions - we are using /opt/crosstool-ng-1.17.0 in this example:
 ./configure --prefix=/opt/crosstool-ng-1.17.0
  • If configure fails due to missing dependencies, install them for your platform using the package manager (i.e. yum install, apt-get install, etc.)
  • during the build you might need packages for expat, libexpat1-dev, python-dev
  • When configure completes successfully, make and install it:
make
make install
  • Add the crosstool-NG bin folder to your path. The easiest way to do this is add it to PATH in your .profile, for example:
PATH=$PATH:/opt/crosstool-ng-1.17.0/bin

Build GCC Linaro

  • Make a new directory in your home directory where you want to run crosstool-NG, then change to it.
  • Configure crosstool-NG:
ct-ng menuconfig
  • Set the following options (derived from the arm-bcm2708hardfp-linux-gnueabi build on GitHub):
    • Paths & Misc:
      • Check "Try features marked as EXPERIMENTAL"
      • Set "Prefix directory" to whereever you want the finished toolchain to be placed (e.g. /home/<yourname>/crosscompile)
      • Set "Number of parallel jobs" to be the number of processor cores in your system x1.5
    • Target options:
      • Set "Target architecture" to "ARM"
      • Set "Endianness" to "Little endian"
      • Set "Bitness" to "32-bit"
      • Set "Architecture level" to "armv6zk"
      • Set "Emit assembly for CPU" to "arm1176jzf-s"
      • Set "Tune for CPU" to "arm1176jzf-s"
      • Set "Use specific FPU" to "vfp"
      • Set "Floating point" to "hardware (FPU)"
      • Set "Default instruction set mode" to "arm"
      • Check "Use EABI"
    • General toolchain:
      • Set "Tuple's vendor string" to "rpi" - you can choose whatever you like here and it will appear in the compiler filenames.
    • Operating system:
      • Set "Target OS" to "linux"
      • Set "Linux kernel version" to match that running on the RPI (it was tested with the 3.6 branch patched to version 3.6.3)
    • Binary utilities:
      • Set "Binary format" to "ELF"
      • Set "binutils version" to "2.22"
    • C compiler:
      • Check "Show linaro versions"
      • Set "gcc version" to "linaro-4.7-2012.10"
      • Check "C++"
      • Set "gcc extra config" to "--with-float=hard" (Note: see "Discussion" page)
      • Check "Link libstdc++ statically into gcc binary"
    • C-library:
      • Set "C library" to "eglibc", or, as eglibc gets deprecated[2], glibc from version 2.19 up.
      • Set "eglibc version" to "2_13", however, to reduce the size of your executables you could also try to match it with the libc already present on the Pi and select a custom libc-version here, for example the exact commit your libc was build from if you can reveal that. The major version of libc can be made visible with
ldd 
  • Build it:
ct-ng build
  • All the required source will now be downloaded and built - exact times vary according to processing power and internet connection speed.

Configure system to use new compiler

Your compiler will be located in /home/<yourname>/crosscompile (or whereever you specified in the configuration). You can choose to move it to another location (e.g. /opt/arm) if you want to. Then, add that location to your PATH:

PATH=$PATH:/opt/arm/bin:/opt/crosstool-ng-1.17.0/bin

Now if you run:

arm-rpi-linux-gnueabi-gcc -v

you should get the version information from your new build. It should end something like:

gcc version 4.7.3 20121001 (prerelease) (crosstool-NG 1.17.0)

By the way, this manual also works for the newest stable gcc-linaro-5.3-2016.05 at http://releases.linaro.org/components/toolchain/gcc-linaro/5.3-2016.05/

References