С одной сборкой GCC, все
соответствующие библиотеки и правильные
флаги, отправленные в GCC, могу ли я произвести
PE исполняемый файл для Windows x86
затем создайте исполняемый файл ELF
для встроенного устройства Linux MIPS и
наконец исполняемый файл для OSX
PowerPC машина? Если не может кто-то
объясните как бы вы этого добились?
Нет. Одна сборка GCC создает объектный код для одной целевой архитектуры. Вам понадобится сборка для Intel x86, сборка для MIPS и сборка для PowerPC. Однако компилятор - не единственный инструмент, который вам нужен, несмотря на то, что вы можете встроить исходный код в исполняемый файл с помощью одного вызова GCC. Под капотом он также использует ассемблер (as
) и компоновщик (ld
), и они должны быть собраны для целевой архитектуры и платформы. Обычно GCC использует версии этих инструментов из пакета GNU binutils, поэтому вам необходимо создать их и для целевой платформы.
Подробнее о создании кросс-компиляции инструментария можно прочитать здесь .
Я не совсем понимаю, как я был
под впечатлением GCC можно создать
двоичный машинный код для большей части
общие архитектуры
Это верно в том смысле, что исходный код самого GCC может быть встроен в компиляторы, предназначенные для различных архитектур, но вам все равно требуются отдельные сборки.
Что касается -march
, это не позволяет одной и той же сборке GCC переключаться между платформами. Скорее он используется для выбора допустимых инструкций для использования с тем же семейством процессоров. Например, некоторые инструкции, поддерживаемые современными процессорами x86, не были поддержаны самыми ранними процессорами x86, потому что они были введены позже (например, наборы команд расширения, такие как MMX и SSE). Когда вы передаете -march
, GCC включает все коды операций, поддерживаемые этим процессором и его предшественниками. Цитировать руководство GCC:
При выборе определенного типа процессора будет
планировать вещи соответствующим образом для этого
конкретный чип, компилятор не будет
генерировать любой код, который не работает на
i386 без типа -march = cpu
опция используется.