Невозможно выполнить кросс-компиляцию в SPARC с помощью clang

Итак, вот ситуация: мне нужно иметь возможность компилировать двоичные файлы с компьютера с Linux (в Ubuntu, для чего это стоит), которые могут работать с сервера SPARC. Программа, которую я пытаюсь скомпилировать, очень проста:

#include <stdio.h>
#include <stdlib.h>

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

Я пробовал несколько разных строк компиляции, чтобы заставить его работать, но, к сожалению, ничего не работает.

Я попробовал традиционный:

 clang -target sparc blah.c -o blahsparc

Но это не работает, с кучей ошибок ассемблера:

 /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)

Я пробовал это также:

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

который жалуется на отсутствующие заголовки, поэтому вместо -cc1 я использую -Xclang:

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

однако, это также терпит неудачу из-за «ошибки: неизвестный целевой ЦП ‘x86-64′».
Я не уверен, где продолжить это. Я также пытался использовать crosstool-ng с очень небольшим успехом.

6

Решение

Начиная с выпуска 3.4.2 (июнь 2014 г.), в llvm отсутствует код, необходимый для создания объектных файлов для целей sparc. Старые выпуски (1.x & 2.x) имел поддержку для этого, но инфраструктура для создания объектных файлов в llvm была тогда менее развитой. Когда текущая структура была развернута, похоже, что они не перенесли все платформы.

документация кажется, подразумевает, что комбинация llvm / gcc, как известно, работает, но я думаю, что таблица была табулирована на основе гораздо более ранней версии llvm, когда у них была менее зрелая структура для генерации объектных файлов.

В ревизии SVN была добавлена ​​поддержка создания объектных файлов. r198533 (эта тема обсуждает коммит), но, как вы можете видеть в 3.4.2 финальная версия, файлы & изменения добавлены в r198533 нет


Кроме того, в настоящее время Clang не работает в Sparc Solaris (не уверен насчет Sparc в целом). У парсера, похоже, проблемы с разбором шаблонов; Я получаю coredumps & подобное, аналогичное, похожее. Я столкнулся с нить Примерно неделю назад обсуждались проблемы выравнивания в sparc / solaris clang, и это может быть одной из причин, по которой clang еще не может использоваться на этой платформе.

4

Другие решения

Если вам нужен кросс-компилятор для Sparc, который работает на машине с Ubuntu, самый простой способ, который я знаю, — это использовать Buildroot. Вот небольшой учебник о том, как получить кросс-компилятор и протестировать сгенерированные исполняемые файлы на эмуляторе Sparc.

3

LLVM 3.6.2 теперь имеет некоторую поддержку sparc … Я смог собрать llvm 3.6.2 и clang 3.6.2-r100 на моем T2000. Я не получил поддержку C ++, но я создал умеренно сложные приложения на C, такие как htop.

Я скомпилировал LLVM, используя gcc 5.2, однако более низкая версия также должна работать, хотя я бы предложил по крайней мере gcc 4.9 и не ниже gcc 4.7.

LLVM, возникший на gentoo, аварийно завершил работу во время компиляции, но я смог возобновить его, переместившись в каталог portage с помощью ebuild-файлов llvm и перезапустив сборку вручную:

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

Мне пришлось переопределить некоторые из компилятора по умолчанию:

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

Я не знаю, сможете ли вы использовать это для сборки на компьютере с архитектурой x86 … хотя предполагается, что clang сможет это сделать. Но в худшем случае вы можете добиться этого в qemu-system-sparc64 vm или на каком-то реальном оборудовании, которое вы можете найти дешево на ebay (оборудование T5xxx дешевеет, а лезвия очень дешевы)

Недавно я обновился до clang 3.8 (который пока не выпущен), и мне удалось скомпилировать приложение c ++, передав -lstdc ++ в дополнение к указанным выше параметрам. Я считаю, что это то же самое поведение, что и gcc, когда вызывается как gcc, а не g ++.

3
По вопросам рекламы [email protected]