8/3/2019 Tool Chains
1/33
1
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free-electrons.com
Embedded Linux system development
Cross-compiling
toolchains
Thomas Petazzoni
Michael Opdenacker
Free Electrons
Copyright 2004-2010, Free Electrons.Creative Commons BY-SA 3.0 license
Latest update: Jan 19, 2011,
Document sources, updates and translations:
http://free-electrons.com/docs/toolchains
Corrections, suggestions, contributions and translations are welcome!
http://free-electrons.com/docs/toolchainshttp://free-electrons.com/docs/toolchains8/3/2019 Tool Chains
2/33
2Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free-electrons.com
Definition (1)
The usual development tools available on a GNU/Linux workstation is a
native toolchain
This toolchain runs on your workstation and generates code for your
workstation, usually x86
For embedded system development, it is usually impossible or not
interesting to use a native toolchainThe target is too restricted in terms of storage and/or memory
The target is very slow compared to your workstation
You may not want to install all development tools on your target.
Therefore, cross-compiling toolchains are generally used. They run
on your workstation but generate code for your target.
8/3/2019 Tool Chains
3/33
3Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free-electrons.com
Definition (2)
x86
ARMx86
Compilation
machine
Execution
machine
Source code
Native toolchainCross-compiling
toolchain
x86 binary ARM binary
8/3/2019 Tool Chains
4/33
4Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free-electrons.com
Components
Binutils Kernel headers
C/C++ libraries GCC compiler
GDB debugger
(optional)
8/3/2019 Tool Chains
5/33
5Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free-electrons.com
Binutils
Binutils is a set of tools to generate and manipulate binaries for a
given CPU architectureas, the assembler, that generates binary code from assemblersource code
ld, the linker
ar, ranlib, to generate .a archives, used for libraries
objdump, readelf, size, nm, strings, to inspect binaries.Very useful analysis tools !
strip, to strip useless parts of binaries in order to reduce their size
http://www.gnu.org/software/binutils/
GPL license
http://www.gnu.org/software/binutils/http://www.gnu.org/software/binutils/8/3/2019 Tool Chains
6/33
6Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free-electrons.com
Kernel headers (1)
The C library and compiled programs
needs to interact with the kernelAvailable system calls and their
numbers
Constant definitions
Data structures, etc.
Therefore, compiling the C library
requires kernel headers, and many
applications also require them.
Kernel
Kernel headers
C Library
Applications
Available in and and a few other
directories corresponding to the ones visible in include/ in the
kernel sources
8/3/2019 Tool Chains
7/33
7Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free-electrons.com
Kernel headers (2)
System call numbers, in
Constant definitions, here in , included
from , included from
Data structures, here in
#define __NR_exit 1#define __NR_fork 2#define __NR_read 3
#define O_RDWR 00000002
struct stat {
unsigned long st_dev;unsigned long st_ino;
[...]};
8/3/2019 Tool Chains
8/33
8Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free-electrons.com
Kernel headers (3)
The kernel-to-userspace ABI is backward compatible
Binaries generated with a toolchain using kernel headers older than
the running kernel will work without problem, but won't be able to
use the new system calls, data structures, etc.
Binaries generated with a toolchain using kernel headers newer
than the running kernel might work on if they don't use the recentfeatures, otherwise they will break
Using the latest kernel headers is not necessary, unless access to
the new kernel features is needed
The kernel headers are extracted from the kernel sources usingthe headers_install kernel Makefile target.
GCC il
8/3/2019 Tool Chains
9/33
9Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free-electrons.com
GCC compiler
GNU C Compiler, the famous free software compiler
Can compile C, C++, Ada, Fortran, Java, Objective-
C, Objective-C++, and generate code for a large
number of CPU architectures, including ARM, AVR,
Blackfin, CRIS, FRV, M32, MIPS, MN10300,
PowerPC, SH, v850, i386, x86_64, IA64, Xtensa, etc.
http://gcc.gnu.org/
Available under the GPL license,
libraries under the LGPL.
C lib
http://gcc.gnu.org/http://gcc.gnu.org/8/3/2019 Tool Chains
10/33
10Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free-electrons.com
C library
The C library is an essential component of a
Linux systemInterface between the applications and the
kernel
Provides the well-known standard C API to
ease application developmentSeveral C libraries are available:
glibc, uClibc, eglibc, dietlibc, newlib, etc.
The choice of the C library must be made at
the time of the cross-compiling toolchaingeneration, as the GCC compiler is compiled
against a specific C library.
Kernel
C Library
Applications
lib
8/3/2019 Tool Chains
11/33
11Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free-electrons.com
glibc
http://www.gnu.org/software/libc/
License: LGPL
C library from the GNU project
Designed for performance, standards compliance and
portability
Found on all GNU / Linux host systems
Of course, actively maintained
Quite big for small embedded systems: approx 2.5 MBon arm(version 2.9 - libc: 1.5 MB, libm: 750 KB)
Clib
http://www.gnu.org/software/libc/http://www.gnu.org/software/libc/8/3/2019 Tool Chains
12/33
12Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free-electrons.com
uClibc
http://www.uclibc.org/from CodePoet Consulting
License: LGPL
Lightweight C library for small embedded systems
High configurability: many features can be enabled or
disabled through a menuconfig interfaceWorks only with Linux/uClinux, works on most embedded
architectures
No stable ABI, different ABI depending on the library
configurationFocus on size rather than performance
Small compile time
Clib (2)
http://www.uclibc.org/http://www.uclibc.org/8/3/2019 Tool Chains
13/33
13Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free-electrons.com
uClibc (2)
Most of the applications compile with uClibc. This applies to all
applications used in embedded systems.Size (arm): 4 times smaller than glibc!
uClibc 0.9.30.1: approx. 600 KB (libuClibc: 460 KB, libm: 96KB)
glibc 2.9: approx 2.5 MB
Used on a large number of production embedded products, includingconsumer electronic devices
Actively maintained, large developer and user base
Now supported by MontaVista, TimeSys and Wind River.
uClibc (3)
8/3/2019 Tool Chains
14/33
14Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free-electrons.com
uClibc (3)
After compilation and installation, the following components are available
Standard headers, stdio.h, stdlib.h, unistd.h and others,and Linux kernel headers, integrated with the C library headers.
The libraries themselves, with mainly
libuClibc, the C library itself
ld-uClibc, the dynamic loader, responsible for loading the
shared libraries at the beginning of a program's execution
librt, the library implementing the real-time related functions
libstdc++, the C++ standard library
libpthread, the threads library
libm, the mathematic library
Honey I shrunk the programs!
8/3/2019 Tool Chains
15/33
15Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free-electrons.com
Honey, I shrunk the programs!
C program Compiled with shared libraries Compiled statically
glibc uClibc glibc uClibc
Plain hello world
(stripped)
5.6 K
(glibc 2.9)
5.4 K
(uClibc 0.9.30.1)
472 K
(glibc 2.9)
18 K
(uClibc
0.9.30.1)
Busybox
(stripped)
245 K
(older glibc)
231 K
(older uClibc)
843 K
(older glibc)
311 K
(older uClibc)
Executable size comparison on ARM
eglibc
8/3/2019 Tool Chains
16/33
16Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free-electrons.com
eglibc
Embedded glibc , under the LGPL
Variant of the GNU C Library (GLIBC) designed to work well onembedded systems
Strives to be source and binary compatible with GLIBC
eglibc's goals include reduced footprint, configurable components,
better support for cross-compilation and cross-testing.
Can be built without support for NIS, locales, IPv6, and many other
features.
Supported by a consortium, with Freescale, MIPS, MontaVista and
Wind River as members.The Debian distribution is switching to eglibc too:
http://blog.aurel32.net/?p=47
http://www.eglibc.org
Other smaller C libraries
http://blog.aurel32.net/?p=47http://www.eglibc.org/http://www.eglibc.org/http://blog.aurel32.net/?p=478/3/2019 Tool Chains
17/33
17Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free-electrons.com
Other smaller C libraries
Several other smaller C libraries have been developed, but
none of them have the goal of allowing the compilation oflarge existing applications
They need specially written programs and applications
Choices:
Dietlibc, http://www.fefe.de/dietlibc/. Approximately 70 KB.
Newlib, http://sourceware.org/newlib/
Klibc, http://www.kernel.org/pub/linux/libs/klibc/, designed
for use in an initramfs or initrd at boot time.
Building a toolchain
http://www.fefe.de/dietlibc/http://sourceware.org/newlib/http://www.kernel.org/pub/linux/libs/klibc/http://www.kernel.org/pub/linux/libs/klibc/http://sourceware.org/newlib/http://www.fefe.de/dietlibc/8/3/2019 Tool Chains
18/33
18Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free-electrons.com
Building a toolchain
Three machines must be distinguished when discussing
toolchain creation
The build machine, where the toolchain is built.
The host machine, where the toolchain will be executed.
The target machine, where the binaries created by the
toolchain will be executed.
Four build types are possible
Building a toolchain (2)
8/3/2019 Tool Chains
19/33
19Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free-electrons.com
Building a toolchain (2)
build host target
Native buildused to build the normal gcc of a
workstation
build host target
Cross buildused to build a toolchain that runs on your
workstation but generates binaries for the
target
build host target
Cross-native buildused to build a toolchain that runs on your
target and generates binaries for the
target
build host target
Canadian buildused to build on architecture A a toolchain
that runs on architecture B and generates
binaries for architecture C
The most common solution in embedded
Building a toolchain (3)
8/3/2019 Tool Chains
20/33
20Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free-electrons.com
Building a toolchain (3)
Many decisions must be made when building a toolchain
Choosing the C library
Choosing the version of the different components
Choosing the configuration of the toolchain
Which ABI should be used ? Toolchains for the ARMarchitecture for example, can generate binaries using the
OABI (Old ABI) or the EABI (Embedded ABI), that are
incompatible
Should the toolchain support software floating point, or does
the hardware support floating point operations ?
Should the toolchain support locales, IPv6, or other specific
features ?
Building a toolchain (4)
8/3/2019 Tool Chains
21/33
21Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free-electrons.com
Building a toolchain (4)
Crosstool build reports: http://kegel.com/crosstool/crosstool-0.43/buildlogs
Basic steps
http://kegel.com/crosstool/crosstool-0.43/buildlogshttp://kegel.com/crosstool/crosstool-0.43/buildlogs8/3/2019 Tool Chains
22/33
22Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free-electrons.com
Basic steps
Extract and install kernel headers
Extract, configure, compile and install binutils
Extract, configure and compile a first version gcc that
generates binaries for the target. It will be used to cross-
compile the C library.
Extract, configure and compile the C library using the
previously generated compiler.
Re-configure and compile the final gcc cross-compiler.
Homebuilt toolchains
8/3/2019 Tool Chains
23/33
23Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free-electrons.com
Homebuilt toolchains
Building a cross-compiling toolchain by yourself is a difficult
and painful task! Can take days or weeks!Lots of details to learn. Several components to build.
Lots of decisions to make
(such as C library version and configuration for your platform)
Need kernel headers and C library sources
Need to be familiar with current gcc issues and patches on your
platform
Useful to be familiar with building and configuring toolshttp://www.aleph1.co.uk/armlinux/docs/toolchain/toolchHOWTO.pdf
can show you how fun it can be!
Get a precompiled toolchain
http://www.aleph1.co.uk/armlinux/docs/toolchain/toolchHOWTO.pdfhttp://www.aleph1.co.uk/armlinux/docs/toolchain/toolchHOWTO.pdf8/3/2019 Tool Chains
24/33
24Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free-electrons.com
Get a precompiled toolchain
Solution that most people choose, because it is the simplest
and most convenient solution
First, determine what toolchain you need: CPU, endianism, C
library, component versions, ABI, soft float or hard float, etc.
Many pre-compiled toolchains are freely available:
CodeSourcery, http://www.codesourcery.com, is a
reference in that area, but they only provide glibc
toolchains.
See the next page for Linaro toolchainsoptimized for ARM.
See also http://elinux.org/Toolchains
Linaro toolchains
http://www.codesourcery.com/http://elinux.org/Toolchainshttp://elinux.org/Toolchainshttp://www.codesourcery.com/8/3/2019 Tool Chains
25/33
25Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free-electrons.com
Linaro toolchains
https://wiki.linaro.org/WorkingGroups/ToolChain
Linaro contributes to improving mainstream
gcc on ARM, in particular by hiring
CodeSourcery developers.
For people who can't wait for the next releases of gcc, Linaro
releases modified sources of stable releases of gcc, with theseoptimizations for ARM (mainly for recent Cortex A CPUs).
As any gcc release, these sources can be used by build tools to
build their own binary toolchains (Buildroot, OpenEmbedded...)
This allows to support glibc, uClibc and eglibc.Binary packages are available for Ubuntu users:
See https://launchpad.net/~linaro-maintainers/+archive/toolchain
Installing and using a precompiled toolchain
https://wiki.linaro.org/WorkingGroups/ToolChainhttps://launchpad.net/~linaro-maintainers/+archive/toolchainhttps://launchpad.net/~linaro-maintainers/+archive/toolchainhttps://wiki.linaro.org/WorkingGroups/ToolChain8/3/2019 Tool Chains
26/33
26Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free-electrons.com
sta g a d us g a p eco p ed too c a
Follow the installation procedure proposed by the vendor
Usually, it is simply a matter of extracting a tarball at the
proper place
Toolchains used not to be relocatable!
You must install them in the location they were built for.
This is no longer true with gcc 4.x, thanks to sysroot
support, but it is still more convenient to install them at
the proper place.
Then, add the path to toolchain binaries in your PATH:
export PATH=/path/to/toolchain/bin/:$PATH
Toolchain building utilities
8/3/2019 Tool Chains
27/33
27Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free-electrons.com
a b g s
Another solution is to use utilities that automate the process of
building the toolchain
Same advantage as the pre-compiled toolchains: you don't need
to mess up with all the details of the build process
But also offers more flexibility in terms of toolchain configuration,
component version selection, etc.
They also usually contain several patches that fix known issues
with the different components on some architectures
Identical principle: shell scripts or Makefile that automatically
fetch, extract, configure, compile and install the different
components
Toolchain building utilities (2)
8/3/2019 Tool Chains
28/33
28Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free-electrons.com
Crosstool
The precursor, written by Dan Kegel
Set of scripts and patches, glibc-only
Not really maintained anymore
http://www.kegel.com/crosstool
Crosstool-ng
Rewrite of Crosstool, with a menuconfig-like configuration system
Feature-full: supports uClibc, glibc, eglibc, hard and soft float, many
architectures
Actively maintained
http://ymorin.is-a-geek.org/dokuwiki/projects/crosstool
g ( )
Toolchain building utilities (3)
http://www.kegel.com/crosstoolhttp://ymorin.is-a-geek.org/dokuwiki/projects/crosstoolhttp://ymorin.is-a-geek.org/dokuwiki/projects/crosstoolhttp://www.kegel.com/crosstool8/3/2019 Tool Chains
29/33
29Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free-electrons.com
g ( )
Many root filesystem building systems also allow the construction of
cross-compiling toolchain
Buildroot
Makefile-based, uClibc only, maintained by the community
http://buildroot.uclibc.org
PTXdist
Makefile-based, uClibc or glibc, maintained mainly by
Pengutronix
http://www.pengutronix.de/software/ptxdist/index_en.html
OpenEmbedded
The feature-full, but complex building system
http://www.openembedded.org/
Practical lab Using Crosstool-NG
http://buildroot.uclibc.org/http://www.pengutronix.de/software/ptxdist/index_en.htmlhttp://www.openembedded.org/http://www.openembedded.org/http://www.pengutronix.de/software/ptxdist/index_en.htmlhttp://buildroot.uclibc.org/8/3/2019 Tool Chains
30/33
30Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free-electrons.com
g
Time to build your toolchain
Configure Crosstool-NG
Run it to build your own cross-
compiling toolchain
Related documents
8/3/2019 Tool Chains
31/33
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free-electrons.com
All our technical presentations
on http://free-electrons.com/docs
Linux kernel
Device drivers
Architecture specifics
Embedded Linux system development
How to help
http://free-electrons.com/docshttp://free-electrons.com/docs8/3/2019 Tool Chains
32/33
Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http//free-electrons.com
You can help us to improve and maintain this document...
By sending corrections, suggestions, contributions and
translations
By asking your organization to order development, consulting
and training services performed by the authors of these
documents (see http://free-electrons.com/).
By sharing this document with your friends, colleagues
and with the local Free Software community.
By adding links on your website to our on-line materials,to increase their visibility in search engine results.
Free ElectronsLinux kernel
http://free-electrons.com/http://free-electrons.com/8/3/2019 Tool Chains
33/33
Custom Development
System integrationEmbedded Linux demos and prototypes
System optimization
Application and interface development
Free ElectronsOur services
Embedded Linux Training
All materials released with a free license!
Unix and GNU/Linux basics
Linux kernel and drivers development
Real-time Linux, uClinux
Development and profiling tools
Lightweight tools for embedded systemsRoot filesystem creation
Audio and multimedia
System optimization
Consulting and technical support
Help in decision making
System architecture
System design and performance review
Development tool and application support
Investigating issues and fixing tool bugs
Linux device drivers
Board support code
Mainstreaming kernel code
Kernel debugging