Difference between revisions of "Cross-compiling Linux kernel on x86 64"

From Linux Driver Project
Jump to: navigation, search
(References and Package repositories)
(Work in progress)
Line 154: Line 154:
=== Work in progress ===
=== Work in progress ===
* Working on a script to automate compiles.
* Add support for defconfig on architectures that don't support.
* Add support for defconfig on architectures that don't support.

Revision as of 15:07, 10 May 2013



Cross-compiling Linux kernel on x86_64

I recently installed several cross-compilers on my x86_64 test system running Ubuntu 12.10 (Precise). It took some work finding the repositories and correct cross-compiler packages, then figuring out how to install and compile kernels. I am sharing my notes on where to find cross-compilers, how to install them, and how to compile on each of these architectures. This is by no means new information, just a compilation of all my sources and my own discoveries along the way on how to compile.

Installation Preparation

Get your system ready for installation and find packages.

Test/Build System Configuration

First of all, make sure the target test system has essetinal packages to compile x86_64 or x83_32 Linux kernel in native mode, in which case it already has the build-essential package installed. If not, the following is needed to get the test system ready:

   sudo apt-get install build-essential

I am going to cover, how to install and compile for alpha, arm, arm64, c6x, mips, mipsel, powerpc, sh, sparc, and tile. I tried installing microblaze, and couldn not find the correct cross-compiler for this architecture.

Let's start with common packages all cross-compilers need.

Installing common packages

   sudo apt-get install binutils-multiarch
   sudo apt-get install ncurses-dev (Note - required package to run make menuconfig)
   sudo apt-get install alien

Configure apt for arm64 repo

   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

I found alpha, mips, mipsel, powerpc, sh, and sparc cross-compilers on www.emdebian.org repository. Configure the package manager first:

   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

The following fedora repo is a great source for several cross-compilers and binutils rpms. In my case, since my test system is debian based, I downloaded the rpms and used alien to comver them .deb format, and installed them using dpkg. If your test system is rpm based, you could simply add the repo to yum configuration and install these using yum.


I downloaded tile and c6x binutils and gcc from this repo. In the case of tile, make sure you have the latest compiler, gcc-tile-linux-gnu-4.7.2-2.aa.20121114svn.fc17.x86_64.rpm. The older version is missing feedback.h that tilegx needs.

c6x rpms:

  • binutils-c6x-linux-gnu-
  • gcc-c6x-linux-gnu-4.7.2-2.aa.20121114svn.fc17.x86_64.rpm

tile rpms:

  • binutils-tile-linux-gnu-
  • gcc-tile-linux-gnu-4.7.2-2.aa.20121114svn.fc17.x86_64.rpm

Now convert rpms to .debs: (you will have to install alien if you don't have it on your system)

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

You will see warnings about missing keys like the one below and you can safely ingnore them.

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

You will end up with the following .debs:

  • binutils-c6x-linux-gnu_2.
  • gcc-c6x-linux-gnu_4.7.2-3_amd64.deb
  • binutils-tile-linux-gnu_2.
  • gcc-tile-linux-gnu_4.7.2-3_amd64.deb

Installation Steps

Note: Creating link to *arch*-linux-gnu-gcc is required to use CROSS_COMPILE directive. For example creating link to aarch64-linux-gnu-gcc is required to use CROSS_COMPILE directive.

Installing alpha cross-compiler

   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

Installing arm cross-compiler

Please note that arm doesn't need link creation.

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

Installing arm64 cross-compiler

Note that arm64 cross-compile works on Linux 3.7 and later kernels.

   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

Installing mips cross-compiler

   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

Installing mipsel cross-compiler

   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

Installing powerpc cross-compiler

   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

Installing sh cross-compiler

   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

Installing sparc cross-compiler

   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

Install the converted .debs

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


Please note that some architectures don't have good support for make ARCH=arch defconfig. In those cases, I end up picking a configuration file from configs. In some cases, you might see errors in LD phase, and please keep in mind these are just compile tests.

alpha cross-compile

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

arm cross-compile

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

arm64 cross-compile

Note: works on Linux 3.7 and later releases.

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

c6x cross-compile

   make distclean
   cp arch/c6x/configs/dsk6455_defconfig .config
   ARCH=c6x CROSS_COMPILE=c6x-linux-gnu- make all

mips cross-compile

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

mipsel cross-compile

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

powerpc cross-compile

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

sh cross-compile

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

sparc cross-compile

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

tile cross-compile

   make distclean
   cp arch/tile/configs/tilegx_defconfig .config
   ARCH=tile CROSS_COMPILE=tile-linux-gnu- make all

Work in progress

  • Add support for defconfig on architectures that don't support.

References and Package repositories

Personal tools