Общие вопросы о GCC и кросс-компиляции - PullRequest
15 голосов
/ 16 декабря 2010

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

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

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

Ответы [ 2 ]

12 голосов
/ 16 декабря 2010

С одной сборкой 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 опция используется.

2 голосов
/ 16 декабря 2010

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

...