Я пытаюсь создать кросс-компилятор gcc. Я понимаю, что перед компиляцией кросс-компилятора мне нужно уже построить целевые binutils. зачем сборке компилятора целевые binutils? только компилятор берет только код высокого уровня и превращает его в сборку, которую я определил в исходных кодах компилятора. так зачем мне целевые bintools для компиляции кросс-компилятора? Во всей документации кросс-компилятора написано, что мне нужно, чтобы они были собраны перед компиляцией кросс-компилятора. (например, http://wiki.osdev.org/Building_GCC и http://www.ifp.illinois.edu/~nakazato/tips/xgcc.html).
сборка binutils перед компилятором gcc
Ответы (3)
Кажется, ваш ключевой вопрос:
зачем сборке компилятора целевые binutils?
Как описано в разделе Создание кросс-компилятора, часть процесса сборки кросс-компилятора GNU -compiler предназначен для создания библиотек времени выполнения для целевой системы с использованием недавно скомпилированного кросс-компилятора. Таким образом, binutils
для цели должен присутствовать для успешного выполнения этого шага.
может сначала создать кросс-компилятор, используя пустые файлы для подмножества binutils
компонентов, которые нужны gcc
- например, as
и ld
, ar
и ranlib
- затем соберите и установите целевые binutils
компоненты в нужные места, затем создайте целевые библиотеки времени выполнения.
Но было бы менее подвержено ошибкам делать что-то следующим образом (и документация рекомендует это): сначала построить binutils
для цели, поместить указанные исполняемые файлы в исходное дерево gcc
, а затем построить кросс-компилятор.
GCC нужен ассемблер для преобразования создаваемой сборки в объектные файлы (машинный код) и компоновщик для связывания объектных файлов вместе для создания исполняемых файлов и разделяемых библиотек. Также нужен архиватор для создания статических библиотек / архивов.
Эти три обычно предоставляются пакетом binutils (среди других полезных инструментов): ассемблер GNU as
, компоновщик ld
и ar
архиватор.
crt*.o
для цели, и, вероятно, компоновщик тоже (особенно, если вы собираетесь создавать стандартную библиотеку C ++).
- person Mat; 08.12.2013
crt*.o
находятся в целевом машинном коде. Они не работают на хосте, они связаны с целевыми двоичными файлами. И они не создаются каждый раз, когда вы компилируете какой-либо код, они создаются как часть (кросс-) компилятора.
- 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 будут инструменты для создания и управления двоичными файлами для данной архитектуры процессора. Не для одного хоста, который использует