Как сделать кросс-компилятор с помощью gcc?

Хотя в Интернете есть много руководств по созданию кросс-компилятора, я на самом деле не понимаю.

Я использую fedora 16 и уже установил gcc. Я не уверен насчет binutils. Как мне создать кросс-компилятор для моей собственной ОС (целевой)? Я читал здесь, на вики os dev, но ничего не понял. Я имею в виду, что мне делать? Я просто не следую этим шагам.

Примечание. Я хочу создать кросс-компилятор для той же архитектуры, над которой я сейчас работаю. Я имею в виду ту же архитектуру, на которой работает Fedora.


person Suhail Gupta    schedule 16.07.2013    source источник
comment
Это хорошее руководство по сборке утилит (binutils, newlib) и gcc. sourceware.org/ml/crossgcc/2005-08/ msg00114/l-cross-ltr.pdf   -  person Oscar Castiblanco    schedule 16.07.2013
comment
Это будет зависеть от того, как выглядит ваша собственная ОС. Если это доморощенная ОС для той же архитектуры, что и ваша Fedora, то это самая простая ситуация: вы можете решить ее с помощью собственного скрипта компоновщика.   -  person rodrigo    schedule 16.07.2013
comment
Является ли использование gcc обязательным для вас? Если нет, то можно попробовать llvm-clang. Изучить llvm-clang гораздо проще, потому что он так и задуман. Ищите «Учебное пособие: создание серверной части за 24 часа — пошаговое руководство по созданию серверной части». в llvm.org/devmtg/2009-10   -  person A. K.    schedule 16.07.2013


Ответы (1)


Если архитектура вашей собственной ОС такая же, как у вашей работающей ОС, то вам не нужен новый компилятор, подойдет тот, который у вас уже есть. Тем не менее, вам все еще может понадобиться пользовательский binutils, но это зависит от формата исполняемых файлов, требуемых вашей собственной ОС.

Что я сделал для своей игрушечной ОС, так это заставил ее понимать двоичные файлы ELF: это абсурдно простой формат для загрузки и запуска. И таким образом вы можете использовать стандартный binutils вашей ОС. Вам просто нужно связать свои исполняемые файлы с помощью специального скрипта компоновщика, а не с какой-либо библиотекой Linux.

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

Моя команда компилятора выглядит так:

%.o: %.c
        gcc -c -o $@ -ffreestanding -fno-stack-protector -mpreferred-stack-boundary=2 -Os -g -Wall $<

И моя команда компоновщика:

%.myexe: %.o
        ld -o $@ -T myexe.ld $^ `gcc -print-libgcc-file-name`

Для справки, скрипт компоновщика myexe.ld:

ENTRY(main)

SECTIONS
{
    .text :
    {
        *(.text)
    }
    .data :
    {
        *(.data)
    }
    .rodata :
    {
        *(.rodata)
    }
    .bss :
    {
        *(.bss)
    }
}
person rodrigo    schedule 16.07.2013
comment
Мне неизвестны . и *, которые вы использовали в скрипте компоновщика. Это какой-то язык? я ничего об этом не знаю - person Suhail Gupta; 17.07.2013
comment
@SuhailGupta: подробности можно прочитать в info ld. По сути, раздел SECTIONS используется для определения макета конечного исполняемого файла. Например, последний раздел ELF с именем .text (.text : { ... }) будет состоять из конкатенаций .text разделов ((.text)) каждого объектного файла (*). Конечно, это еще не все, это только самые основы. Дополнительные биты во многом зависят от особенностей вашей ОС. - person rodrigo; 17.07.2013