0% found this document useful (0 votes)
240 views

Cross-Compiling Linux Kernels On x86 - 64: A Tutorial On How To Get Started

The document discusses cross-compiling Linux kernels on x86_64 systems. It covers installing cross-compilers for architectures like ARM, ARM64, MIPS, PowerPC and others. The steps include preparing the system, installing packages from Ubuntu/Debian repositories, downloading RPMs from Fedora and converting them to DEBs, and configuring the build environment. Demo sections show installing compilers for ARM and ARM64 and cross-compiling a kernel for those architectures.

Uploaded by

Pramod Kumar
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
240 views

Cross-Compiling Linux Kernels On x86 - 64: A Tutorial On How To Get Started

The document discusses cross-compiling Linux kernels on x86_64 systems. It covers installing cross-compilers for architectures like ARM, ARM64, MIPS, PowerPC and others. The steps include preparing the system, installing packages from Ubuntu/Debian repositories, downloading RPMs from Fedora and converting them to DEBs, and configuring the build environment. Demo sections show installing compilers for ARM and ARM64 and cross-compiling a kernel for those architectures.

Uploaded by

Pramod Kumar
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 34

Cross-compiling Linux Kernels on

x86_64: A tutorial on How to Get


Started

Shuah Khan
Senior Linux Kernel Developer – Open Source Group
Samsung Research America (Silicon Valley)
shuah.kh@samsung.com
Agenda

● Cross-compile value proposition


● Preparing the system for cross-compiler installation
● Cross-compiler installation steps
● Demo – install arm and arm64
● Compiling on architectures
● Demo – compile arm and arm64
● Automating cross-compile testing
● Upstream cross-compile testing activity
● References and Package repositories
● Q&A
Cross-compile value proposition

● 30+ architectures supported (several sub-archs)


● Native compile testing requires wide range of test
systems – not practical
● Ability to cross-compile non-natively on an widely
available architecture helps detect compile errors
● Coupled with emulation environments (e.g: qemu) testing
on non-native architectures becomes easier
● Setting up cross-compile environment is the first and
necessary step
arch/

alpha
frv

arc microblaze
h8300 s390
um
arm mips
hexagon score x86_64

arm64 mn10300 unicore32


ia64 sh xtensa
avr32 openrisc x86
m32r sparc
blackfin parisc
m68k tile
c6x powerpc
metag
cris
Cross-compiler packages

● Ubuntu arm packages (12.10 or later)


– gcc-arm-linux-gnueabi
– gcc-arm-linux-gnueabihf
● Ubuntu arm64 packages (13.04 or later) – use arm64
repo for older Ubuntu releases.
– gcc-4.7-aarch64-linux-gnu
● Ubuntu keeps adding support for compilers. Search
Ubuntu repository for packages.
Cross-compiler packages

● Embedded Debian Project is a good resource for alpha,


mips, mipsel, powerpc, sh, and sparc cross-compilers.
– gcc-4.7-alpha-linux-gnu
– gcc-4.7-mips-linux-gnu
– gcc-4.7-mipsel-linux-gnu
– gcc-4.7-powerpc-linux-gnu
– gcc-4.7-sh4-linux-gnu
– gcc-4.7-sparc-linux-gnu
Cross-compiler packages
● Fedora repo and Fedora Epel Repo are a good sources for several
cross-compilers and binutils rpms
– blackfin
● binutils-bfin-linux-gnu-2.23.51.0.3-1.fc17.x86_64.rpm
● gcc-bfin-linux-gnu-4.7.1-0.1.20120606.fc17.x86_64.rpm

– c6x

binutils-c6x-linux-gnu-2.23.51.0.3-1.fc17.x86_64.rpm

gcc-c6x-linux-gnu-4.7.2-2.aa.20121114svn.fc17.x86_64.rpm
– tile

binutils-tile-linux-gnu-2.23.51.0.3-1.fc17.x86_64.rpm
● gcc-tile-linux-gnu-4.7.2-2.aa.20121114svn.fc17.x86_64.rpm
Preparing the system for
cross-compiler installation
● Choose an x86-64 system
● Install Ubuntu 12.10 or later.
– Ubuntu 13.04 Install
Install common packages

sudo apt-get install build-essential

sudo apt-get install binutils-multiarch

sudo apt-get install ncurses-dev

sudo apt-get install alien

Note: ncurses-dev is required to run menuconfig and alien to generate .deb from .rpm
Configure apt for arm64 repo
(Ubuntu 12.10)

wget -O - http://people.debian.org/~wookey/bootstrap/bootstrap-archive.key | sudo apt-key add

sudo apt-add-repository 'deb http://people.debian.org/~wookey/bootstrap/ubunturepo/ quantal-bootstrap main'

sudo apt-get update


Configure apt for emdebian repo

sudo apt-get install emdebian-archive-keyring

Create /etc/apt/sources.list.d/emdebian.list file with the following line:


deb http://www.emdebian.org/debian/ sid main
Download rpms from fedora repo

● blackfin rpms:
– binutils-bfin-linux-gnu-2.23.51.0.3-1.fc17.x86_64.rpm
– gcc-bfin-linux-gnu-4.7.1-0.1.20120606.fc17.x86_64.rpm
● c6x rpms:
– binutils-c6x-linux-gnu-2.23.51.0.3-1.fc17.x86_64.rpm
– gcc-c6x-linux-gnu-4.7.2-2.aa.20121114svn.fc17.x86_64.rpm
● tile rpms
– binutils-tile-linux-gnu-2.23.51.0.3-1.fc17.x86_64.rpm
– gcc-tile-linux-gnu-4.7.2-2.aa.20121114svn.fc17.x86_64.rpm
– Note: gcc-tile-linux-gnu-4.7.2-2.aa.20121114svn.fc17.x86_64.rpm is
what you want. The older version is missing feedback.h, tilegx needs.
Convert rpms to .deb

sudo alien -d binutils-bfin-linux-gnu-2.23.51.0.3-1.fc17.x86_64.rpm

sudo alien -d gcc-bfin-linux-gnu-4.7.1-0.1.20120606.fc17.x86_64.rpm

sudo alien -d binutils-c6x-linux-gnu-2.23.51.0.3-1.fc17.x86_64.rpm

sudo alien -d gcc-c6x-linux-gnu-4.7.2-2.aa.20121114svn.fc17.x86_64.rpm

sudo alien -d binutils-tile-linux-gnu-2.23.51.0.3-1.fc17.x86_64.rpm

sudo alien -d gcc-tile-linux-gnu-4.7.2-2.aa.20121114svn.fc17.x86_64.rpm

You will see warnings about missing keys e.g: below which you can safely ignore.

warning: gcc-tile-linux-gnu-4.7.2-2.aa.20121114svn.fc17.x86_64.rpm:
Header V3 RSA/SHA256 Signature, key ID 1aca3465: NOKEY
Resulting .debs

➔ binutils-bfin-linux-gnu_2.23.51.0.3-2_amd64.deb
➔ binutils-c6x-linux-gnu_2.23.51.0.3-2_amd64.deb
➔ binutils-tile-linux-gnu_2.23.51.0.3-2_amd64.deb
➔ gcc-bfin-linux-gnu_4.7.1-1.1_amd64.deb
➔ gcc-c6x-linux-gnu_4.7.2-3_amd64.deb
➔ gcc-tile-linux-gnu_4.7.2-3_amd64.deb
Install cross-compilers
alpha
sudo apt-get install --install-recommends gcc-4.7-alpha-linux-gnu
sudo ln -s /usr/bin/alpha-linux-gnu-gcc-4.7 /usr/bin/alpha-linux-gnu-gcc

arm
sudo apt-get install gcc-arm-linux-gnueabi

arm64
sudo apt-get install --install-recommends gcc-4.7-aarch64-linux-gnu
sudo ln -s /usr/bin/aarch64-linux-gnu-gcc-4.7 /usr/bin/aarch64-linux-gnu-gcc

mips
sudo apt-get install --install-recommends gcc-4.7-mips-linux-gnu
sudo ln -s /usr/bin/mips-linux-gnu-gcc-4.7 /usr/bin/mips-linux-gnu-gcc

mipsel
sudo apt-get install --install-recommends gcc-4.7-mipsel-linux-gnu
sudo ln -s /usr/bin/mipsel-linux-gnu-gcc-4.7 /usr/bin/mipsel-linux-gnu-gcc
Install cross-compilers
powerpc
sudo apt-get install --install-recommends gcc-4.7-powerpc-linux-gnu
sudo ln -s /usr/bin/powerpc-linux-gnu-gcc-4.7 /usr/bin/powerpc-linux-gnu-gcc

sh
sudo apt-get install --install-recommends gcc-4.7-sh4-linux-gnu
sudo ln -s /usr/bin/sh4-linux-gnu-gcc-4.7 /usr/bin/sh4-linux-gnu-gcc

arm64
sudo apt-get install --install-recommends gcc-4.7-aarch64-linux-gnu
sudo ln -s /usr/bin/aarch64-linux-gnu-gcc-4.7 /usr/bin/aarch64-linux-gnu-gcc

sparc
sudo apt-get install --install-recommends gcc-4.7-sparc-linux-gnu
sudo ln -s /usr/bin/sparc-linux-gnu-gcc-4.7 /usr/bin/sparc-linux-gnu-gcc

Note: Creating link to *arch*-linux-gnu-gcc is necessary as the


CROSS_COMPILE directive
to find the compilers.
Install cross-compilers from .debs

blackfin
sudo dpkg -i binutils-bfin-linux-gnu_2.23.51.0.3-2_amd64.deb
sudo dpkg -i gcc-bfin-linux-gnu_4.7.1-1.1_amd64.deb

c6x
sudo dpkg -i binutils-c6x-linux-gnu_2.23.51.0.3-2_amd64.deb
sudo dpkg -i gcc-c6x-linux-gnu_4.7.2-3_amd64.deb

tile
sudo dpkg -i binutils-tile-linux-gnu_2.23.51.0.3-2_amd64.deb
sudo dpkg -i gcc-tile-linux-gnu_4.7.2-3_amd64.deb
arch/compile

alpha
frv

arc microblaze
h8300 s390
um
arm mips
hexagon score x86_64

arm64 mn10300 unicore32


ia64 sh xtensa
avr32 openrisc x86
m32r sparc
blackfin parisc
m68k tile
c6x powerpc
metag
cris
Building from sources

● Mauro Chehab's build_cross script


– downloads compiler sources for a specified arch from
gnu repo, builds and installs.
– Usage: build_cross arm
– Runs on fedora
Demo arm and arm64 install
Compilation Tips

● If make ARCH=arch defconfig fails on an arch, pick a


config to test from arch/*/configs
● Some architectures don't support defconfig in
cross-compile mode. e.g: powerpc.
● In some cases, you might see errors in LD phase, and
please keep in mind these are just compile tests.
Cross-compiling

alpha
make distclean
make ARCH=alpha defconfig
ARCH=alpha CROSS_COMPILE=alpha-linux-gnu- make all
arm
make distclean
make ARCH=arm defconfig
ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- make all

arm64 (3.7 and later)


make distclean
make ARCH=arm64 defconfig
ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- make all

blackfin
make distclean
make ARCH=blackfin defconfig
ARCH=blackfin CROSS_COMPILE=bfin-linux-gnu- make all
Cross-compiling

c6x (3.4 and later)


make distclean
make ARCH=c6x defconfig
ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- make all

mips
make distclean
make ARCH=mips defconfig
ARCH=mips CROSS_COMPILE=mips-linux-gnu- make all

mipsel
make distclean
make ARCH=mips defconfig
ARCH=mips CROSS_COMPILE=mipsel-linux-gnu- make all

powerpc
make distclean
cp arch/powerpc/configs/wii_defconfig .config
ARCH=powerpc CROSS_COMPILE=powerpc-linux-gnu- make all
Cross-compiling

sh
make distclean
make ARCH=sh defconfig
ARCH=sh CROSS_COMPILE=sh4-linux-gnu- make all

sparc
make distclean
make ARCH=sparc defconfig
ARCH=sparc CROSS_COMPILE=sparc-linux-gnu- make all

tile
make distclean
make ARCH=tile defconfig
ARCH=tile CROSS_COMPILE=tile-linux-gnu- make all
Demo arm and arm64 compilation
Automating cross-compile testing

● Script – cross_compile.sh automates builds for the


compilers mentioned in this talk
● ktest – crosstests.conf
● Buildbot – tool for automating software builds. It can be
configured to checkout Linux kernel sources from git
repos and build.
Upstream Cross-compile testing
activity
● Linux Kernel stable queue builds project
– Guenter Rock keeps adding new compilers each
week.
– Configs: allmodconfig, defconfig, configs with mmu
and without (nommu) where applicable.
– qemu test results on selected architectures.
References and Package
repositories
● ARMv8 Debian and Ubuntu bootstrap repositories
● Embedded Debian Project
● Fedora Repo
● Fedora Epel Repo
● Kernel.org - crosstool
● Ubuntu 13.04 Install
● Buildbot
● Linux Kernel stable queue builds project
● Ktest
Q&A
Thank you.

Shuah Khan
Senior Open Source Developer – Open Source Group
Samsung Research America (Silicon Valley)
shuah.kh@samsung.com
Summary

● Cross-compiling Linux Kernels on x86_64: A tutorial on How to Get


Started
● Agenda
● Cross-compile value proposition
● arch/
● Cross-compiler packages
● Cross-compiler packages
● Cross-compiler packages
● Preparing the system for cross-compiler installation
● Install common packages
● Configure apt for arm64 repo (Ubuntu 12.10)
● Configure apt for emdebian repo
● Download rpms from fedora repo
● Convert rpms to .deb
● Resulting .debs
● Install cross-compilers
● Install cross-compilers
● Install cross-compilers from .debs
● arch/compile
● Building from sources
● Compilation Tips
● Cross-compiling
● Cross-compiling
● Cross-compiling
● Automating cross-compile testing
● Upstream Cross-compile testing activity
● References and Package repositories
● Thank you.

You might also like

pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy