I also run into this problem today (after removing the dust from
our ARDrones). So the arm-linux toolchain of ubuntu 16.04 is
definitely too recent. Here is an other option (a bit less
intrusive) to solve this:
- install it with 'sudo dpkg -i
parrot-tools-linuxgnutools-2012.03_1.0.0-1_i386.deb', the code
will end up in /opt/arm-2012.03
- add proper compiler PREFIX as an airframe configure option
<configure name="PREFIX"
value="/opt/arm-2012.03/bin/arm-none-linux-gnueabi"/>
It should be enough. You can check when compiling that the
correct toolchain is used: 'arm-none-linux-gnueabi-gcc (Sourcery
CodeBench Lite 2012.03-57) 4.6.3'.
Hi everyone.
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 problem.
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
upgrade:
$ 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 file):
$ 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
version v2.4.8).
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.
Regards,
--- Riccardo Paolo Bestetti
Il 10/08/2016 02:02, Riccardo Paolo
Bestetti ha scritto:
Hello Felix.
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
2.6.32.9-g980dab2
Which is a much older kernel version than 3.2.0.
From what I gather from the glibc documentation [1], the
solution would be linking against a glibc version configured
and cross-compiled with the following option:
./configure --enable-kernel=2.6.32
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
address@hidden:~/glibc_build/build$ make
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
the problem.
Regards,
--- Riccardo Paolo Bestetti
Notes:
- https://www.gnu.org/software/libc/manual/html_node/Configuring-and-compiling.html
Il 09/08/2016 23:56, Felix Ruess ha scritto:
Hi Riccardo,
the cross compiler from the
team-gcc-arm-embedded ppa is only for cross
compiling to embedded (bare metal) targets.
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?
Cheers, Felix
_______________________________________________
Paparazzi-devel mailing list
address@hidden
https://lists.nongnu.org/mailman/listinfo/paparazzi-devel
_______________________________________________
Paparazzi-devel mailing list
address@hidden
https://lists.nongnu.org/mailman/listinfo/paparazzi-devel
_______________________________________________
Paparazzi-devel mailing list
address@hidden
https://lists.nongnu.org/mailman/listinfo/paparazzi-devel