Good news: I got it to work on Ubuntu 16.04!
Kinda bad-ish news: I took a shortcut.
To make it work, I installed an older version of the
cross-compiler from the Ubuntu Trusy repository, which contains an
older version of the cross-compiler setup. The method should work
on pretty much any apt-based distribution that presents my same
I'm writing it as a tutorial, so it can readily be used by people
coming from e.g. Google.
This is how I did it:
1 - Removed the installed g++-arm-linux-gnueabi and g++-arm-linux-gnueabi
packages, autoremoved all the dependencies, updated & upgraded
everything (this is useful for the last step):
$ sudo apt-get remove g++-arm-linux-gnueabi g++-arm-linux-gnueabi
$ sudo apt-get autoremove
$ sudo apt-get update
$ sudo apt-get upgrade
2 - Added main and universe repo components
from Ubuntu Trusty to the end (very important unless you
want to screw up your distro) of my sources.list &
updated the package lists:
$ sudo sh -c "echo 'deb http://archive.ubuntu.com/ubuntu trusty main universe' >> /etc/apt/sources.list"
$ sudo apt-get update
3 - Reinstalled g++-arm-linux-gnueabi and g++-arm-linux-gnueabi,
this time by pinning the trusty repo with the -t option:
$ sudo apt-get install -t trusty g++-arm-linux-gnueabi g++-arm-linux-gnueabi
4 - Noted the packages that apt tries to upgrade to the last
version from the list given by this command (I omitted sudo
on purpose, the flag -s launches a simulation which
doesn't need a lock):
$ apt-get upgrade -s
5 - Marked the aforementioned packages to be held back, to avoid
them being upgraded again to the last version by apt-get
$ sudo apt-mark hold binutils-arm-linux-gnueabi cpp-4.7-arm-linux-gnueabi cpp-arm-linux-gnueabi g++-4.7-arm-linux-gnueabi g++-arm-linux-gnueabi gcc-4.7-arm-linux-gnueabi gcc-4.7-arm-linux-gnueabi-base gcc-arm-linux-gnueabi libc6-armel-cross libc6-dev-armel-cross libcloog-ppl1 libgcc-4.7-dev-armel-cross libgcc1-armel-cross libgomp1-armel-cross libppl-c4 libstdc++6-4.7-dev-armel-cross libstdc++6-armel-cross linux-libc-dev-armel-cross
Note that the package list could be slightly different for other
distros than mine, or even for the same one, so don't just
blindly copy this last command! Always take the package list
from the 4th step.
6 - Optional but suggested, you can now remove the trusty repo
from your sources.list, as it's never good to have repos
for different releases on the same system (execute the
following command only once, as it deletes the last line of the
$ sudo sed -i '$ d' /etc/apt/source.list
These steps should install the cross-compiler from the trusty
repos, which contains a version of the cross-compiled glibc that
supports Linux >= 2.6.32 (hence, the Ar.Drone 2 with software
After doing this, I launched Paparazzi, selected the appropriate
xml files for the Ar.Drone 2, cleaned, built the autopilot,
uploaded it and it worked.
Executing the file command on the ap.elf
executable confirms that it supports Linux 2.6.32.
Hope this will help someone in the future.
Riccardo Paolo Bestetti
Il 10/08/2016 02:02, Riccardo Paolo
Bestetti ha scritto:
Compiler version: arm-linux-gnueabi-gcc (Ubuntu/Linaro
5.4.0-6ubuntu1~16.04.1) 5.4.0 20160609.
Paparazzi version: v5.8.2_stable-0-g6260b7c-dirty.
I think I now have a good grasp on the issue.
As far as I understand, the "kernel too old" error happens when
statically linking code to a glibc that was configured not to
contain compatibility code.
This can indeed be confirmed with the file command:
address@hidden:~/paparazzi$ file var/aircrafts/ardrone2/ap/ap.elf
ap.ef: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), statically linked, for GNU/Linux 3.2.0, [...]
On the Ar.Drone 2, software version v2.4.8:
# uname -r
Which is a much older kernel version than 3.2.0.
From what I gather from the glibc documentation , the
solution would be linking against a glibc version configured and
cross-compiled with the following option:
Running the following commands (assuming a bare x86_64 Ubuntu
16.04 system with all Paparazzi's dependencies installed) gets
me a libc.a that, if I'm not missing something, should be what I
need to link against to get a working ap.elf on my Ar.Drone 2
running Linux 2.6.32:
address@hidden:~/glibc_build$ wget http://ftp.gnu.org/gnu/libc/glibc-2.24.tar.xz
address@hidden:~/glibc_build$ tar -xJf glibc-2.24.tar.xz
address@hidden:~/glibc_build$ mkdir build && cd build
address@hidden:~/glibc_build/build$ sudo apt-get install gawk
address@hidden:~/glibc_build/build$ ../glibc-2.24/configure arm-linux-gnueabi --host=arm-linux-gnueabi --build=x86_64-pc-linux-gnu --prefix= --enable-kernel=2.6.32
Now I have:
address@hidden:~/glibc_build/build$ ls -la | grep libc.a$
-rw-rw-r-- 1 paparazzi paparazzi 16964358 ago 10 01:39 libc.a
How do I feed it to the cross-compiler in the Paparazzi build
process? And if that really works, how can this be integrated in
the Paparazzi build system?
Note: sorry if the email feels disorganized, when I first
started writing it I had a much less specific understanding of
--- Riccardo Paolo Bestetti
Il 09/08/2016 23:56, Felix Ruess ha scritto:
the cross compiler from the team-gcc-arm-embedded
ppa is only for cross compiling to embedded (bare
The ARDrone runs Linux so arm-linux-gnueabi-gcc from
the gcc-arm-linux-gnueabi package is used.
When you compile the ap target for it, it should print
the exact version at the beginning...
I think most people using the ARDrone2 are still using
Ubuntu 14.04, so I'm not sure if the cross compiler with
16.04 has been tested so far (although I can't think of
a reason why it wouldn't work with the new compiler).
Maybe someone who actually has/uses an ARDrone2 (e.g. from
TU Delft) can chip in here?
Also what Paparazzi version (output of ./paparazzi_version)
are you using?
Paparazzi-devel mailing list
Paparazzi-devel mailing list