Дистро предоставил кросс-компилятор против специально созданного gcc

Я собираюсь сделать кросс-компиляцию для Raspberry Pi, в основном небольшого компьютера ARM. Хост будет представлять собой коробку i686 под управлением Arch Linux.

Мой первый инстинкт - использовать кросс-компилятор, предоставляемый Arch Linux, arm-elf-gcc-base и arm-elf-binutils. Тем не менее, каждая вики и публикация, которую я читаю, используют какую-то версию пользовательской сборки gcc. Кажется, они тратят много времени на приготовление своего собственного гкц. Проблема в том, что они никогда не говорят, ПОЧЕМУ важно использовать их gcc поверх другого.

Можно ли использовать кросс-компиляторы, поставляемые с дистрибутивом, для сборки Raspberry Pi или ARM в общих ядрах и приложениях?

Нужно ли иметь несколько компиляторов для архитектуры ARM? Если да, то почему, поскольку один gcc может поддерживать все варианты x86?

Если 2), то как я могу определить, какое целевое подмножество поддерживается конкретной версией gcc?

Более общий вопрос, какие общие случаи использования требуют пользовательской сборки gcc?

Пожалуйста, будь настолько техническим, насколько ты можешь, яхотелось бы знать, ПОЧЕМУ, а также как.

 auselen30 окт. 2012 г., 21:31
@dwelch посмотри на это про идеальный компилятор:en.wikipedia.org/wiki/Full_employment_theorem
 old_timer30 окт. 2012 г., 20:28
Успешная сборка кросс-компилятора на основе GNU может дать вам кое-что, с чем вы можете поработать, но не обязательно создавать все приложения или драйверы, необходимые для дистрибутива. Если вы покопаетесь в gcc, то увидите уродливого зверя, скрепленного клейкой лентой и проволочной сеткой. Требуется немало времени, чтобы научиться приручать этого зверя (только для того, чтобы снова начать учиться каждый раз).
 old_timer30 окт. 2012 г., 20:17
да, вы можете использовать предварительно построенный. Затем скачайте исходные коды gcc или binutils ./configure --help и посмотрите на варианты, если это не то, что могут и могут отличаться в зависимости от версии по сравнению с предварительно собранной. предварительно построенный это просто обычай, используя предпочтения одного человека. также с кастомами вы можете использовать определенные версии gcc, возможно, более новые. также предварительные сборки, такие как codeourcery (теперь наставник), имеют улучшения или изменения в источнике по различным причинам (добавление или исправление поддержки для целевого ядра или операционной системы, отсутствующей в стабильном источнике)
 old_timer30 окт. 2012 г., 22:51
просто получите (ранее) кодовый источник (теперь наставник графика) облегченный набор инструментов. или используйте buildroot для его создания и используйте его до тех пор, пока ваш проект не будет завершен или он не потерпит неудачу, а затем подумайте о том, как исправить вашу цепочку инструментов. Обе эти группы людей имеют опыт и проводят время, беспокоясь о сборке инструментария, так что вам это не нужно. решить одну проблему за один раз (создание приложений или набор инструментов).
 old_timer30 окт. 2012 г., 20:21
sigle gcc может поддерживать все варианты x68 - слишком расплывчато, gcc 2.95 не может поддерживать функции 2012 x86, не так ли? Нету. По той же причине вы можете и увидите пользовательские сборки gcc с различными дистрибутивами или приложениями в x86. Если бы gcc был безупречен, никаких ошибок и завершен (все функции поддерживаются, завершены, без ошибок), то не было бы никаких обновлений для gcc, кроме добавления новых процессоров, верно? Я не вижу разработки на gcc, демонстрирующей, что она закончена и не содержит ошибок.

Ответы на вопрос(1)

Решение Вопроса

компиляция) для другой машины (цели) по сравнению с их собственной (хостом), они используют терминtoolchain описать набор инструментов, необходимых для создания бинарных файлов. Тот'Потому что, когда вам нужно создать исполняемый двоичный файл, вам нужен не только компилятор.

Вам нужны процедуры (crt0.o) инициализировать время выполнения в соответствии с требованиями операционной системы и стандартных библиотек. Вам необходим стандартный набор библиотек, и эти библиотеки должны знать о ядре в целевой системе из-за системных вызовов API и нескольких конфигураций уровня ОС (например, размер страницы) и структур данных (например, структуры времени).

Что касается аппаратного обеспечения, существует другой набор архитектур ARM. Архитектуры могут быть обратно совместимыми, но по своей природе цепочка инструментов является двоичной и предназначена для конкретной архитектуры. Вы можете иметь самую распространенную архитектуру по умолчанию, но тогда это выиграетбыть слишком плодотворным для уже ограниченного окружения (встроенное устройство). Если у вас новейшая архитектура, то она выиграетбыть полезным для старых архитектурных целей.

Когда вы создаете двоичный файл на своем хосте для своего хоста, компилятор может искать все необходимые биты из своей собственной среды или использовать чтоs на хосте - поэтому большинство из вышеперечисленных деталей невидимы для разработчика. Однако, когда вы создаете для цели, отличной от типа вашего хоста, набор инструментов должен знать об оборудовании, операционной системе и деталях стандартной библиотеки. То, как вы говорите это инструментальной цепочке, заключается в том, чтобы ... построить ее в соответствии с теми деталями, которые могут потребовать некоторого уровня начальной загрузки. (или вы можете сделать это с помощью обширного набора параметров, если набор инструментов поддерживает / построен для него.)

Поэтому, когда есть универсальный (стандартный) набор инструментов для кросс-компиляции, у него уже есть набор целевых спецификаций, которые могут не соответствовать вашим требованиям. Пожалуйста, посмотрите это недавнеевопрос о ситуации на Ubuntu для примера.

 mikijov31 окт. 2012 г., 03:05
Можете ли вы прокомментировать, как я могу узнать, поддерживает ли набор инструментов определенную версию ядра ARM? Какие параметры я должен соответствовать? Пока я думаю, что этоядро ","Soft / HardFP ','ко / эльфа а элт? Это правда, и я что-то упустил?
 old_timer30 окт. 2012 г., 22:49
с binutils и gcc (набор инструментов на основе gnu) у вас есть целевой процессор (по умолчанию), но вы можете в командной строке указать другие цели. И с этим можно генерировать код (конвертировать C в asm в двоичный файл), но не обязательно связывать с другими библиотеками в цепочке инструментов (libgcc, libc и т. Д.). Таким образом, ваш набор инструментов может по умолчанию использовать ARMv6, например, он все еще можеткомпилировать Код ARMv4 для вас, но может или не может ссылаться в зависимости от характера цепочки инструментов.
 auselen31 окт. 2012 г., 07:23
gcc -v, выводит, как настроен этот gcc. Префикс toolchain (например, arm-linux-gnueabihf-) может сказать, что это hardfp (hf), однако я нене умею читать libc 'S или CRT вещи встроенные варианты. - Я не'не понимаю, что вы имели в виду под ядром или ко / эльфом.

Ваш ответ на вопрос