Comment compiler de façon croisée mon application pour l'architecture Ubuntu 12.04 armhf sur un hôte Ubuntu 12.04 i386?

16

J'ai une grande application que j'ai écrite. Je peux compiler avec succès l'application dans les scénarios suivants:

  • dans une compilation native pour l'hôte i386 exécutant Ubuntu 12.04
  • nativement sur un PandaBoard exécutant Ubuntu 12.04 (cela prend beaucoup de temps)
  • utiliser Qemu et un chroot sur le PC hôte pour la cible armhf PandaBoard (cela prend beaucoup de temps)

Je voudrais compiler de manière croisée l'application sur l'hôte i386 pour qu'elle s'exécute sur une cible telle que le PandaBoard afin de terminer les builds en temps opportun. Jusqu'à présent, les tentatives faites en utilisant la chaîne d'outils arm-linux-gnueabihf dans les référentiels ont produit des binaires qui ne fonctionnent pas correctement. À ce stade, je n'ai pas l'intention d'emballer le logiciel.

Quelle est la méthode recommandée pour réussir une compilation croisée?

Jonathan Cave
la source
La compilation croisée avec la chaîne d'outils du compilateur croisé devrait fonctionner, c'est à cela qu'elle sert. De quelle manière les binaires ne fonctionnent-ils pas correctement?
Gilles 'SO- arrête d'être méchant'
Mes binaires se terminent presque immédiatement. strace semble indiquer que libc.so.6 n'est pas là où il devrait être.
Jonathan Cave
Cela devrait être réparable par une option de lien (je ne sais pas laquelle). Le système cible exécute-t-il Ubuntu?
Gilles 'SO- arrête d'être méchant'
Oui, la cible exécute également Ubuntu 12.04. J'avais pensé que j'avais peut-être besoin d'utiliser l'option --sysroot pour le compilateur et l'éditeur de liens, mais cela est désactivé dans la chaîne d'outils Ubuntu.
Jonathan Cave
La chaîne d'outils Just Works pour moi, le 12.04. Je viens de le tester sur amd64 et j'ai réussi à exécuter le binaire qu'il a produit sur un serveur armhf. Mais je n'ai pas de machine de construction i386 à portée de main. Si vous rencontrez toujours des problèmes, vous devrez élaborer. Que dit ldd? Qu'avez-vous vu de Strace qui vous a amené à votre conclusion? Voyez si vous pouvez réduire votre problème à un cas de test simple qui devrait fonctionner clairement et présentez les étapes que vous suivez en détail.
Robie Basak

Réponses:

6

https://wiki.linaro.org/Platform/DevPlatform/CrossCompile/UsingMultiArch

https://wiki.ubuntu.com/MultiarchCross

Ubuntu a une chaîne d'outils croisée, apt-get install gcc-arm-linux-gnueabihfmais le travail sur la chaîne d'outils de nouvelle génération est discuté ici: http://gsoc.sitedethib.com/posts/apt-get_install_gcc-4.7-arm-linux-gnueabihf/

Il existe un certain nombre de solutions de contournement qui sont nécessaires à ce stade. Par exemple, si vous utilisez une liaison indirecte (couverte dans la page wiki de linaro), vous devez également éviter d'exécuter des binaires étrangers juste après les avoir compilés.

De plus, c'est vraiment le plus mature avec les outils automatiques.

J'ai obtenu mon package pour effectuer une compilation croisée assez rapidement.

apt-get build-dep -aarmhf foo-pkg
apt-get source foo-pkg
cd foo-pkg-*
dpkg-buildpackage -aarmhf
user72421
la source
3
Veuillez expliquer ce que font ces étapes et ce qu'est le commutateur -aarmhf. Ils ne sont pas familiers à de nombreux utilisateurs, ce qui les oblige à rechercher une autre couche plus profondément pour obtenir une réponse utilisable. Merci.
garyp