Общие вопросы о GCC и кросс-компиляции

Недавно я играл с кросс-компиляцией с использованием GCC и обнаружил, что, кажется, сложная область, цепочки инструментов.

Я не совсем понимаю это, поскольку я был под впечатлением. GCC может создать двоичный машинный код для большинства общих архитектур, и все, что еще действительно имеет значение, - это то, с чем вы связываете библиотеки и какой тип исполняемого файла создается.

Может ли GCC не выполнять все эти вещи самостоятельно? С помощью единой сборки GCC, всех соответствующих библиотек и правильных флагов, отправленных в GCC, я могу создать исполняемый файл PE для машины Windows x86, а затем создать исполняемый файл ELF для встроенного устройства MIPS Linux и, наконец, исполняемый файл для OSX PowerPC машина? Если нет, кто-нибудь может объяснить, как вы это достигнете?

Ответы

Ответ 1

С помощью единой сборки GCC все соответствующие библиотеки и правильные флаги, отправленные в GCC, я мог бы создать PE для Windows x86 машина, затем создайте исполняемый файл ELF для встроенного Linux MIPS-устройства и наконец, исполняемый файл для OSX Машина PowerPC? Если кто-то не может объясните, как вы это достигнете?

Нет. Единая сборка GCC создает объектный код для одной целевой архитектуры. Вам понадобится таргетинг на сборку Intel x86, таргетинг на создание MIPS и таргетинг на создание PowerPC. Однако компилятор - это не единственный инструмент, который вам нужен, несмотря на то, что вы можете создавать исходный код в исполняемый файл с одним вызовом GCC. Под капотом используется ассемблер (as) и компоновщик (ld), и они должны быть построены для целевой архитектуры и платформы. Обычно GCC использует версии этих инструментов из пакета GNU binutils, поэтому вам нужно будет также создать его для целевой платформы.

Подробнее о создании кросс-компиляции toolchain здесь.

Я не совсем понимаю это, поскольку я был под впечатлением, которое GCC может создать двоичный машинный код для большей части общие архитектуры

Это верно в том смысле, что исходный код самого GCC может быть встроен в компиляторы, предназначенные для разных архитектур, но вам по-прежнему нужны отдельные сборки.


Что касается -march, это не позволяет одной и той же сборке GCC переключаться между платформами. Скорее, он использовал для выбора допустимых инструкций для использования в одном семействе процессоров. Например, некоторые из инструкций, поддерживаемых современными процессорами x86, не поддерживались самыми ранними процессорами x86, потому что они были введены позже (например, наборы инструкций расширения, такие как MMX и SSE). Когда вы передаете -march, GCC включает все коды операций, поддерживаемые этим процессором и его предшественниками. Чтобы процитировать руководство GCC:

При выборе определенного типа cpu надлежащим образом планировать для этого конкретный чип, компилятор не будет генерировать любой код, который не запускается i386 без -march = cpu-type используется.

Ответ 2

Если вы хотите попробовать кросс-компиляцию и не хотите самостоятельно создавать инструментальную цепочку, я бы рекомендовал посмотреть на CodeSourcery. У них есть инструментальная цепочка на основе GNU, и их бесплатная версия Lite поддерживает несколько архитектур. Я использовал его для Linux/ARM и Android/ARM.