Home > Linux, Software management, Testing > Getting Started with MultiArch (armel / armhf) in Ubuntu

Getting Started with MultiArch (armel / armhf) in Ubuntu

Until now, I used xapt and dpkg-cross to install cross libraries for armel, but since I’ve upgraded to Ubuntu 12.04, it appears to be broken. I’ve contacted Linaro about this issue, and the “cross-building” expert at Linaro (wookey) recommended me to use multiarch instead, as xapt/dpkg-cross will be eventually deprecated.

He provided me an example showing how-to use multiarch to build Chromium. I’ve been looking for a “How-to multiarch”, but haven’t been able to find something really clear and simple, so I thought I would post it here.

In the example, they used a chroot for cross-building, which is probably a good idea to avoid messing up with the system. It’s also possible multiarch is not 100% reliable, and I’ve read stories where people messed up their system when using multiarch with i386 (32-bit) and amd64 (64-bit).

Preparing a chroot for cross-building

I’ll use a 32-bit Ubuntu precise chroot, but you can use an older distribution (e.g. oneric) and 64-bit if needed:

sudo debootstrap --arch=i386 --variant=buildd precise /srv/precise-i386
sudo chroot /srv/precise-i386/
mount -t proc proc /proc

Setup the /etc/apt/sources.list:

deb [arch=i386] http://archive.ubuntu.com/ubuntu precise main universe
deb [arch=armel] http://ports.ubuntu.com/ubuntu-ports precise main universe
deb-src http://archive.ubuntu.com/ubuntu precise main universe

The file above is setup for armel, but you could also set it up for armhf or both [arch=armel,armhf].

Some packages might not be in precise, so it’s better to create /etc/apt/sources.list.d/linaro-maintainers.list to add Linaro ppas:

deb http://ppa.launchpad.net/linaro-maintainers/overlay/ubuntu precise main
deb-src http://ppa.launchpad.net/linaro-maintainers/overlay/ubuntu precise main
deb http://ppa.launchpad.net/linaro-maintainers/staging-overlay/ubuntu precise main
deb-src http://ppa.launchpad.net/linaro-maintainers/staging-overlay/ubuntu precise main

Import the public key of the Overlay, to avoid the GPG error while accessing the PPA:

apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 7BE1F97B

dpkg --add-architecture is not available in the dpkg available in Ubuntu 12.04, so you’ll need to enable multiarch for dpkg manually in /etc/dpkg/dpkg.cfg.d/multiarch:

foreign-architecture armel

Create /etc/apt/apt.conf.d/10local to disable installing recommended and suggested packages:

APT::Install-Recommends "0";
APT::Install-Suggests "0";

Create /usr/sbin/policy-rc.d file to prevent daemons to start in the chroot:

echo "exit 101" > /usr/sbin/policy-rc.d
chmod a+x /usr/sbin/policy-rc.d

Install linaro arm cross-toolchain and essentials:

apt-get update apt-get install g++-arm-linux-gnueabi build-essential

Installing armel packages

Now that your chroot is ready, it’s pretty simple to install armel packages as you just need to append the architecture after the package name, for example:

apt-get install libjpeg-dev:armel libpng12-dev:armel

The libraries are installed in /usr/lib/arm-linux-gnueabi/ and the header files are shared among all architectures in /usr/include, except for armel specific bits which are in /usr/include/arm-linux-gnueabi. If you use armhf instead the libraries will be located in /usr/lib/arm-linux-gnueabihf/.

If you are building your own software, you can just install the dependencies you need and set the CFLAGS, CXXFLAGS and LDFLAGS to the paths above.

Building known packages

Another great feature of multiarch is that you can build known packages with dpkg-buildpackage. When everything works perfectly, you’ll just need to run something like:

apt-get build-dep -aarmel chromium-browser
apt-get source chromium-browser
cd chromium*
dpkg-buildpackage -b -B -aarmel 2>&1|tee ../chromium-browser.log

In the example above, once you’ve configured apt for multiarch, you just need to type 4 commands to retrieve the source and build the chromium-browser for ARM.

I’ve already used this method when building the Linux ARM kernel on Ubuntu 12.04.

Digg This
Reddit This
Stumble Now!
Buzz This
Vote on DZone
Share on Facebook
Bookmark this on Delicious
Kick It on DotNetKicks.com
Share on LinkedIn
Bookmark this on Technorati
Post on Twitter

  1. Nikolay Nikolaev
    May 2nd, 2012 at 20:26 | #1

    That’s very useful, thanks for sharing the information.

    I use schroot for these things. It integrates perfectly in the environment (automatically mounts what’s needed – dev, proc etc.).
    Here’s an excerpt from my /etc/schroot/schroot.conf that shows 32bit chroot on my 64 bit box

    [precise32]
    description=Precise Pangolin 32
    directory=/chroots/precise32
    type=directory
    users=
    root-groups=root
    personality=linux32

    Then as a regular user:
    schroot -c precise32

  2. May 2nd, 2012 at 20:45 | #2

    @ Nikolay Nikolaev
    Thanks I did not know schroot.
    If somebody wants to know more, have a look at the manpage: http://manpages.ubuntu.com/manpages/hardy/man1/schroot.1.html

  3. Nikolay Nikolaev
    May 2nd, 2012 at 22:12 | #3

    @ cnxsoft
    And this is the ‘Precise” manpage (you gave the ‘Hardy’ one):

    http://manpages.ubuntu.com/manpages/precise/man1/schroot.1.html

    cheers

  4. Markus
    October 3rd, 2012 at 17:17 | #4

    Small nits in the description:

    **
    deb-src http://archive.ubuntu.com/ubuntu price main universe
    ->
    deb-src http://archive.ubuntu.com/ubuntu precise main universe

    **
    apt-get update apt-get install g++-arm-linux-gnueabi build-essential
    ->
    apt-get update
    apt-get install g++-arm-linux-gnueabi build-essential

  5. Aline
    April 30th, 2013 at 22:54 | #5

    Hello

    can i install some packages for arm like broser chromium and libxml2 and after can i transfer this to the arm machine ???

    thank you

  6. April 30th, 2013 at 22:57 | #6

    @Aline
    If your ARM machine runs the same distro I guess so, but then running apt-get install within the ARM device would be so much simpler.

  7. Aline
    May 3rd, 2013 at 01:44 | #7

    @cnxsoft

    i dont have a command apt-get to install in my machine ARM what is the solution ??

  8. May 3rd, 2013 at 12:44 | #8

    @Aline
    If you don’t have any package manager such as apt-get, ipkg, zypper, yum… then I suppose you may have to cross-compile the libraries you need.

    Using multiarch on your PC, and copying the required ARM binaries to the target board might also work, but it’s likely you’ll have version conflicts with the libs in your board.

  9. Aline
    May 7th, 2013 at 20:25 | #9

    Hello,

    when i execute apt-get build-dep -a armel chromium-browser

    i get an error didnt find chromium-browser package

    Reading state information… Done
    E: Unable to find a source package for chromium-brwoser

  10. May 7th, 2013 at 20:31 | #10

    @Aline
    Something weird in this log. Did you type “chromium-brwoser” or “chromium-browser” ? I can see both in the log…

    Do you really need to build chromium? You could just install it with something like: apt-get install chromium-browser:armel

  11. Aline
    May 7th, 2013 at 21:08 | #11

    @cnxsoft

    My Problem is i need to compile and install the chromium-browser for arm architecture .
    when i run apt-get install chromium-browser:armel i dont have any output to make in the target arm
    if you have idea about haw can i run apt-get install chromium-browser:arme and befor haw i can make the chromium-browser in my target arm

  12. May 8th, 2013 at 09:57 | #12

    @Aline
    This will install the necessary files, but you’re right, it won’t show which files are necessary. Tools like ldd will help find out which libraries are used by chromium.

    You’d better just follow the cross-compilation instructions @ http://code.google.com/p/chromium/wiki/LinuxChromiumArm

  13. Byung Jang
    August 13th, 2013 at 20:33 | #13

    There is a typo in “deb-src http://archive.ubuntu.com/ubuntu price main universe”. “price” should be “precise”, I think.

  14. August 13th, 2013 at 21:30 | #14

    @Byung Jang
    Thanks for letting me know. I’ve updated the post.

  15. aravind
    October 3rd, 2013 at 19:26 | #15

    Hi , when i’m try install armel packages using apt-get install libjpeg-dev:armel libpng12-dev:armel
    its throwing following error, Can any one suggest me how to resolve those errors

    Reading package lists… Done
    Building dependency tree
    Reading state information… Done
    Note, selecting ‘libjpeg-turbo8-dev:armel’ instead of ‘libjpeg-dev:armel’
    Some packages could not be installed. This may mean that you have
    requested an impossible situation or if you are using the unstable
    distribution that some required packages have not yet been created
    or been moved out of Incoming.
    The following information may help to resolve the situation:

    The following packages have unmet dependencies:
    libjpeg-turbo8-dev:armel : Depends: libjpeg-turbo8:armel (= 1.1.90+svn733-0ubuntu4) but it is not going to be installed
    Depends: libc-dev:armel
    libpng12-dev:armel : Depends: libpng12-0:armel (= 1.2.46-3ubuntu4) but it is not going to be installed
    Depends: zlib1g-dev:armel but it is not going to be installed
    openssh-client : Depends: libedit2 (>= 2.11-20080614-1) but it is not going to be installed
    Recommends: xauth but it is not going to be installed
    E: Error, pkgProblemResolver::Resolve generated breaks, this may be caused by held packages.

  1. May 18th, 2012 at 21:35 | #1
  2. March 7th, 2014 at 08:06 | #2