Impossible d’effectuer une compilation croisée vers SPARC à l’aide de clang

Voici donc la situation: je dois pouvoir comstackr des fichiers binarys à partir d’une machine Linux (sous Ubuntu, à sa juste valeur), capables de fonctionner à partir d’un serveur SPARC. Le programme que j’essaie de comstackr est très simple:

#include  #include  int main() { printf("Testing the SPARC program..."); return EXIT_SUCCESS; } 

J’ai essayé un certain nombre de lignes de compilation pour le faire fonctionner, mais malheureusement, rien ne semble fonctionner.

J’ai essayé le traditionnel:

  clang -target sparc blah.c -o blahsparc 

Mais cela ne fonctionne pas, avec un tas d’échecs d’assembleur:

  /tmp/blah-519e77.s: Assembler messages: /tmp/blah-519e77.s:7: Error: unknown pseudo-op: '.register' /tmp/blah-519e77.s:8: Error: unknown pseudo-op: '.register' /tmp/blah-519e77.s:9: Error: unknown pseudo-op: '.register' /tmp/blah-519e77.s:10: Error: unknown pseudo-op: '.register' /tmp/blah-519e77.s:11: Error: no such instruction: 'save %sp,-240,%sp' /tmp/blah-519e77.s:12: Error: no such instruction: 'st %g0, [%fp+2043]' ... clang: error: assembler (via gcc) command failed with exit code 1 (use -v to see invocation) 

J’ai aussi essayé ceci:

 clang -cc1 -sortingple "sparc-unknown-Linux" blah.c -o blahsparc 

qui se plaint des en-têtes manquants, donc au lieu d’utiliser -cc1, j’utilise -Xclang:

 clang -Xclang -sortingple -Xclang "sparc-unknown-Linux" blah.c -o blahsparc 

cependant, cela échoue également en raison de “erreur: CPU cible inconnu ‘x86-64′”. Je ne sais pas trop où procéder. J’ai aussi essayé d’utiliser crosstool-ng avec très peu de succès.

    Depuis la version 3.4.2 (juin 2014), il manque au code llvm le code nécessaire pour générer des fichiers object pour les cibles sparc. Les anciennes versions (1.x et 2.x) étaient compatibles, mais le cadre de llvm pour l’émission de fichiers objects était moins mature à l’époque. Lors du déploiement de la structure actuelle, il semble qu’ils n’aient pas migré toutes les plates-formes.

    La documentation semble impliquer qu’une combinaison de llvm / gcc est connue pour fonctionner, mais je pense que ce tableau a été compilé sur la base d’une version beaucoup plus ancienne de llvm, alors qu’ils disposaient d’un cadre moins mature pour émettre des fichiers object.

    La prise en charge de l’émission de fichiers object a été ajoutée à leur tronc SVN dans la révision r198533 ( ce fil traite de la validation), mais comme vous pouvez le constater dans la version finale 3.4.2 , les fichiers et les modifications ajoutés dans r198533 ne sont pas présents.


    En passant, clang n’est actuellement pas fonctionnel dans sparc solaris (pas sûr de sparc en général). L’parsingur semble avoir du mal à parsingr les modèles; Je reçois des coredumps et autres. Il y a environ une semaine, j’ai rencontré un fil de discussion traitant de problèmes d’alignement dans sparc / solaris clang, et c’est peut-être l’une des raisons pour lesquelles clang n’est pas encore utilisable sur cette plate-forme.

    Si vous avez besoin d’un compilateur croisé pour Sparc qui s’exécute sur une machine Ubuntu, le moyen le plus simple que je connaisse consiste à utiliser Buildroot. Voici un petit tutoriel sur la façon d’obtenir un compilateur croisé et de tester les exécutables générés sur un émulateur Sparc.

    LLVM 3.6.2 prend maintenant en charge sparc … J’ai été capable de construire llvm 3.6.2 et de clang 3.6.2-r100 sur mon T2000. Le support C ++ n’a pas fonctionné, mais j’ai construit des applications C relativement complexes, telles que htop.

    J’ai compilé LLVM en utilisant gcc 5.2, mais la version la plus basse devrait également fonctionner, bien que je suggère au moins gcc 4.9 et pas inférieur à gcc 4.7.

    LLVM emerge sur gentoo est tombé en panne pendant la compilation mais j’ai pu le reprendre en allant dans le répertoire portage avec les ebuilds llvm et en redémarrant manuellement la construction:

     cd /usr/portage/*/llvm/ ebuild llvm-3.6.2.ebuild merge 

    J’ai dû remplacer certains compilateurs par défaut:

     CC="clang -target sparc-unknown-linux-gnu" CXX="clang++ -target sparc-unknown-linux-gnu" CFLAGS="-O2 -pipe" CXXFLAGS="${CFLAGS}" 

    Je ne sais pas si vous pourrez utiliser cela pour construire à partir d’une machine x86 … bien que Clang soit supposé pouvoir le faire. Mais dans le pire des cas, vous pourrez peut-être utiliser cela dans qemu-system-sparc64 vm ou sur du matériel réel que vous trouverez à bon marché sur eBay (le prix du matériel T5xxx baisse et les lames sont très bon marché).

    J’ai récemment mis à jour Clang 3.8 (ce qui n’a pas encore été publié) et j’ai pu comstackr une application c ++ en passant -lstdc ++ en plus des options ci-dessus. Je crois que c’est le même comportement que gcc lorsqu’il est appelé en tant que gcc plutôt que g ++.