Ответ 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 используется.