сборка binutils перед компилятором gcc

Я пытаюсь создать кросс-компилятор gcc. Я понимаю, что перед компиляцией кросс-компилятора мне нужно уже построить целевые binutils. зачем сборке компилятора целевые binutils? только компилятор берет только код высокого уровня и превращает его в сборку, которую я определил в исходных кодах компилятора. так зачем мне целевые bintools для компиляции кросс-компилятора? Во всей документации кросс-компилятора написано, что мне нужно, чтобы они были собраны перед компиляцией кросс-компилятора. (например, http://wiki.osdev.org/Building_GCC и http://www.ifp.illinois.edu/~nakazato/tips/xgcc.html).


person yehudahs    schedule 08.12.2013    source источник


Ответы (3)


Кажется, ваш ключевой вопрос:

зачем сборке компилятора целевые binutils?

Как описано в разделе Создание кросс-компилятора, часть процесса сборки кросс-компилятора GNU -compiler предназначен для создания библиотек времени выполнения для целевой системы с использованием недавно скомпилированного кросс-компилятора. Таким образом, binutils для цели должен присутствовать для успешного выполнения этого шага.

может сначала создать кросс-компилятор, используя пустые файлы для подмножества binutils компонентов, которые нужны gcc - например, as и ld, ar и ranlib - затем соберите и установите целевые binutils компоненты в нужные места, затем создайте целевые библиотеки времени выполнения.

Но было бы менее подвержено ошибкам делать что-то следующим образом (и документация рекомендует это): сначала построить binutils для цели, поместить указанные исполняемые файлы в исходное дерево gcc, а затем построить кросс-компилятор.

person Mark Plotnick    schedule 08.12.2013

GCC нужен ассемблер для преобразования создаваемой сборки в объектные файлы (машинный код) и компоновщик для связывания объектных файлов вместе для создания исполняемых файлов и разделяемых библиотек. Также нужен архиватор для создания статических библиотек / архивов.

Эти три обычно предоставляются пакетом binutils (среди других полезных инструментов): ассемблер GNU as, компоновщик ld и ar архиватор.

person Mat    schedule 08.12.2013
comment
Я компилирую кросс-компилятор в Linux, и он будет работать в Linux, но создаст exe-файл для другой машины (host! = Linux). Поэтому, когда я компилирую кросс-компилятор, мне нужно использовать as и ld текущей ОС, в которой я нахожусь. Итак, в моем понимании, для компиляции кросс-компилятора мне не нужен хост binutils. Мне нужен только host bintools всякий раз, когда я хочу скомпилировать исходники для хоста, а не вывод кросс-компилятора, когда мне нужно использовать as и ld для хоста. Итак, мой вопрос: зачем они мне нужны перед компиляцией кросс-компилятора? - person yehudahs; 08.12.2013
comment
Вам понадобится как минимум ассемблер для создания таких вещей, как crt*.o для цели, и, вероятно, компоновщик тоже (особенно, если вы собираетесь создавать стандартную библиотеку C ++). - person Mat; 08.12.2013
comment
Хорошо, я понимаю, что при компиляции исходников для цели мне нужны целевые bintools, но это не отвечает на вопрос, зачем они мне нужны для создания кросс-компилятора. Я не собираюсь запускать кросс-компилятор на целевом компьютере ... Я запускаю его на хосте, но беру созданный им exe-файл и запускаю их на целевом объекте ... Кстати, в приведенном выше комментарии, когда я писал host, я имел в виду цель . - person yehudahs; 08.12.2013
comment
Файлы запуска / удаления среды выполнения C crt*.o находятся в целевом машинном коде. Они не работают на хосте, они связаны с целевыми двоичными файлами. И они не создаются каждый раз, когда вы компилируете какой-либо код, они создаются как часть (кросс-) компилятора. - person Mat; 08.12.2013
comment
Итак, вы говорите, что мне нужны целевые bintools, чтобы связать файлы crt.o. И что делается при сборке кросс-компилятора ?! Кстати, это не может быть объектный файл, потому что это означает, что файл crt уже скомпилирован, но как они скомпилировались без кросс-компилятора, чтобы указать доступные инструкции? - person yehudahs; 08.12.2013
comment
Вы создаете кросс-компилятор. К концу сборки кросс-компилятор готов к работе. Он может компилировать код для цели. - person Mat; 08.12.2013

Binutils (двоичные утилиты) предоставляют low-level handling of binary files, например linking, assembling и parsing ELF files. Компилятор GCC зависит от этих инструментов для создания executable, потому что он генерирует объектные файлы, которые binutils собирают в исполняемый образ.

ELF - это формат, который Linux использует для двоичных исполняемых файлов. Компилятор GCC полагается на binutils для обеспечения большей части platform-specific functionality.

Здесь вы выполняете кросс-компиляцию для какой-то другой архитектуры, а не для x86. В результате получаются файлы binutils platform-specific

при настройке должен давать --host! = target. т.е. --host = i686-pc-linux-gnu, где --target = arm-none-linux-gnueabi. Таким образом, полученный исполняемый файл отличается от того, на каком хосте уже есть binutils.

дополнение необходимо знать основные вещи.

build machine, где построен набор инструментов.

host machine, где будет выполняться набор инструментов.

target machine, где исполняются двоичные файлы, созданные цепочкой инструментов.

Таким образом, у binutils будут инструменты для создания и управления двоичными файлами для данной архитектуры процессора. Не для одного хоста, который использует

person vinay hunachyal    schedule 08.12.2013
comment
Я думаю, вы меня неправильно поняли - зачем мне целевые bintools, прежде чем я смогу скомпилировать кросс-компилятор? - person yehudahs; 08.12.2013